За последние 24 часа нас посетили 21746 программистов и 1690 роботов. Сейчас ищут 1914 программистов ...

Составной primary key и auto_increment

Тема в разделе "MySQL", создана пользователем AlexGousev, 6 фев 2008.

  1. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    Таблица:
    [sql]create table properties(id int unsigned auto_increment, object int unsigned, name varchar(100), primary key(id, object));[/sql]

    Инсерты:
    [sql]insert into properties (object, name) values (28, 'Свойство номер один объекта 28');
    insert into properties (object, name) values (28, 'Свойство номер два объекта 28');
    insert into properties (object, name) values (35, 'Свойство номер один объекта 35');
    insert into properties (object, name) values (44, 'Свойство номер один объекта 44');
    insert into properties (object, name) values (44, 'Свойство номер два объекта 44');[/sql]

    Результат:
    [sql]select * from properties;[/sql]
    Код (Text):
    1. +----+--------+--------------------------------+
    2. | id | object | name                           |
    3. +----+--------+--------------------------------+
    4. |  1 |     28 | Свойство номер один объекта 28 |
    5. |  2 |     28 | Свойство номер два объекта 28  |
    6. |  3 |     35 | Свойство номер один объекта 35 |
    7. |  4 |     44 | Свойство номер один объекта 44 |
    8. |  5 |     44 | Свойство номер два объекта 44  |
    9. +----+--------+--------------------------------+
    Что хотелось/ожидалось:
    Код (Text):
    1. +----+--------+--------------------------------+
    2. | id | object | name                           |
    3. +----+--------+--------------------------------+
    4. |  1 |     28 | Свойство номер один объекта 28 |
    5. |  2 |     28 | Свойство номер два объекта 28  |
    6. |  1 |     35 | Свойство номер один объекта 35 |
    7. |  1 |     44 | Свойство номер один объекта 44 |
    8. |  2 |     44 | Свойство номер два объекта 44  |
    9. +----+--------+--------------------------------+
    Т.е. хотелось бы чтобы авто-инкремент работал с учетом значений первичных ключей

    Лучшее из решений, что я нашел:
    [sql]insert into properties (id, object, name) select ifnull(max(id)+1,1), 28, "Свойство номер один объекта 28" from properties where object=28 for update;[/sql]
    То, что max(id) действительно max на момент вставки гарантируется выражением (for update), которое начинает транзакцию. Соответственно работает только с движками бд, поддерживающими транзакции.

    Может, кому-то будет полезно…

    ЗЫ: только заметил: круглое число постов: 1024 :)
     
  2. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    то есть сам автоинкремент не работает и его можно попросту убрать?
     
  3. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    armadillo
    можно
     
  4. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    тогда id вынести отдельно, а prop_num запихнуть в составной индекс и не извращаться
     
  5. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    дык не нужен тебе тут составной праймари кей.
     
  6. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    он нужен для выборки значения напрямую из индекса - из памяти, а не с харда.
     
  7. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    Дело не в том, что мне нужен какой-то порядок в числах. Проблема в том, что при количестве объектов в несколько миллионов штук и количестве свойств в количестве нескольких десятков тысяч, которые еще и удаляются, добавляются и т.д. 4 миллиарда быстро заканчиваются :)
    Поэтому и используется составной первичный ключ.
     
  8. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    только один вопрос - сколько памяти нужно мускулу?
     
  9. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    в бигинт помещается куда больше 4 миллиардов...
     
  10. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    для чего?

    селектов на порядки выше инсертов, использовать бигинт смысла не вижу.
     
  11. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    ну, раз не видишь, тогда не жалуйся, что тебе не хватает 4 миллиардов.
     
  12. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    для работы с индексами при миллиардах записей.
     
  13. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    dark-demon
    А я и не жалуюсь. Мне просто не нравится как оно работает в MySQL. Для себя приемлимое решение нашел, поделился. Все :)

    armadillo
    это трудно определить :)
    Сам процесс mysqld занимает порядка 70 метров. Однако кеш файловой системы занимает всю оставшуюся память.
     
  14. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    ну продолжай дальше испытывать нетрадиционные способы выдирания гланд :)
     
  15. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    мне больше интересно соотношение по скорости разных вариантов при таких объемах.