Можно положиться на первичный ключ автопостепенного увеличения в Вашей базе данных?

Есть две опции:

  • использовать html5 (ваша текущая настройка). В этом случае документация гласит: «Если вы хотите, чтобы ваше поле отображалось как поле даты« HTML5 », вам необходимо использовать виджет single_text с форматом yyyy-MM-dd ...». На самом деле браузер показывает HTML5-виджет со значением 30/12/2019, но отправляет 2019-12-30 при отправке. Проверьте себя: https://www.w3schools.com/html/tryit.asp?filename=tryhtml_input_date

  • не используйте html5:

$builder->add('date_created', DateType::class, [
    'widget' => 'single_text',
    'html5' => false,
    'format' => 'yyyy-MM-dd',
]);

Вы сможете установить и отправить дату в формате yyyy-MM-dd.

5
задан BushyMark 10 May 2009 в 14:08
поделиться

7 ответов

Это зависит от поставщика вашей базы данных.

Я считаю, что MySQL полностью заказывает ключи автоматического увеличения. SQL Server Я не знаю наверняка, поддерживает он это или нет, но я верю, что это так.

Вы столкнетесь с проблемами в базах данных, которые не поддерживают эту функцию, особенно в Oracle, использующем последовательности, которые примерно, но не абсолютно упорядочены.

Альтернативой может быть время создания, а затем идентификатор.

1
ответ дан 15 December 2019 в 06:34
поделиться

Я считаю, что ответ на ваш вопрос - да ... если я читаю между строк, я думаю, вы обеспокоены тем, что система может повторно использовать номера идентификаторов, которые «отсутствуют» в последовательность, и поэтому, если вы использовали 1,2,3,5,6,7 в качестве идентификационных номеров, во всех реализациях, о которых я знаю, следующий идентификационный номер всегда будет 8 (или, возможно, выше), но я не знаю о любой БД, которая попыталась бы выяснить, что идентификатор записи №4 отсутствует, поэтому попытайтесь повторно использовать этот идентификатор.

Хотя я больше всего знаком с SQL Server, я не знаю, почему любой поставщик, который пытается и заполните пробелы в последовательности - подумайте о накладных расходах, связанных с хранением этого списка неиспользованных идентификаторов, в отличие от постоянного отслеживания последнего использованного номера I и добавления 1.

I 'd скажем, вы можете спокойно полагаться на то, что следующий присвоенный ID номер всегда будет выше последнего, а не просто уникальным.

0
ответ дан 15 December 2019 в 06:34
поделиться

Да, идентификатор будет уникальным, и нет, вы не можете и не должны полагаться на него при сортировке - он нужен только для гарантии уникальности строки. Как указал emktas, наилучшим подходом является использование отдельного поля «обновлено» или «создано» только для этой информации.

Для установки времени создания вы можете просто использовать значение по умолчанию, подобное этому

CREATE TABLE foo (
  id INTEGER UNSIGNED AUTO_INCREMENT NOT NULL;
  created TIMESTAMP NOT NULL DEFAULT NOW();
  updated TIMESTAMP;
  PRIMARY KEY(id);
) engine=InnoDB; ## whatever :P

Теперь, что заботится о времени создания. со временем обновления я бы предложил триггер AFTER UPDATE, подобный этому (конечно, вы можете сделать это в отдельном запросе, но триггер, на мой взгляд, является лучшим решением - более прозрачным):

DELIMITER $$
CREATE TRIGGER foo_a_upd AFTER UPDATE ON foo
FOR EACH ROW BEGIN
  SET NEW.updated = NOW();
END;
$$
DELIMITER ;

И это должно сработать .

РЕДАКТИРОВАТЬ: Горе мне. По глупости я не указал, что это для mysql, могут быть некоторые различия в именах функций (а именно, «СЕЙЧАС») и другие тонкие мелочи.

0
ответ дан 15 December 2019 в 06:34
поделиться

Сгенерированные идентификационные номера будут уникальными. Независимо от того, используете ли вы Последовательности, как в PostgreSQL и Oracle, или используете ли вы другой механизм, такой как автоинкремент MySQL.

Однако последовательности чаще всего собираются группами, например, по 20 чисел. Таким образом, с PostgreSQL вы не можете определить, какое поле было вставлено первым. Могут быть даже пробелы в идентификаторах вставленных записей.

Поэтому вам не следует использовать сгенерированное поле идентификатора для такой задачи, чтобы не полагаться на детали реализации базы данных.

Создание created [ Поле 1129611] или обновлено во время выполнения команды намного лучше для сортировки по времени создания или обновления позже. Например:

INSERT INTO A (data, created) VALUES (smething, DATE())
UPDATE A SET data=something, updated=DATE()
2
ответ дан 15 December 2019 в 06:34
поделиться

Одно предостережение по поводу ответа EJB:

SQL не дает никаких гарантий упорядочения, если вы не укажете порядок по столбцам. Например, если вы удалите некоторые ранние строки, а затем вставите их, новые могут оказаться в том же месте в базе данных, что и старые (хотя и с новыми идентификаторами), и это то, что он может использовать в качестве сортировки по умолчанию.

FWIW, я обычно использую order by ID как эффективную версию order by created_at. Это дешевле, поскольку не требует добавления индекса в поле datetime (которое больше и, следовательно, медленнее, чем простой индекс целочисленного первичного ключа), гарантированно будет другим, и мне все равно, если несколько строк, которые были добавленные примерно в то же время сортировать в несколько другом порядке.

0
ответ дан 15 December 2019 в 06:34
поделиться

Вероятно, это зависит от механизма БД. Я бы проверил, как ваша БД реализует последовательности, и если нет задокументированных проблем, я бы решил полагаться на ID.

Например, Последовательность Postgresql в порядке, если вы не играете с параметрами кэша последовательности.

Существует вероятность, что другой программист вручную создаст или скопирует записи из другой БД с неправильным столбцом ID. Однако я бы упростил задачу. Не беспокойтесь о случаях с низкой вероятностью, когда кто-то вручную нарушит целостность данных. От всего не защитишься.

Мой совет - полагаться на идентификаторы, сгенерированные последовательностями, и продвигать свой проект вперед.

0
ответ дан 15 December 2019 в 06:34
поделиться

Теоретически да, самый высокий номер идентификатора создается последним. Помните, однако, что базы данных имеют возможность временно отключить вставку автоматически созданного значения, вручную вставить некоторые записи и затем снова включить. Эти вставки обычно не используются в производственной системе, но иногда могут происходить при перемещении большого блока данных из другой системы.

0
ответ дан 15 December 2019 в 06:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: