Последовательность представляет собой набор целых чисел 1, 2, 3, …, которые генерируются в порядке по требованию. Последовательности часто используются в базах данных, потому что многие приложения требуют, чтобы каждая строка в таблице содержала уникальное значение, и последовательности обеспечивают простой способ создания их.
В этой главе описывается, как использовать последовательности в MySQL.
Самый простой способ использовать последовательности в MySQL, это определить столбец как AUTO_INCREMENT и оставить остальные заботы MySQL.
Попробуйте следующий пример. Он создаст таблицу ANDREYEX и после этого он вставит несколько строк в таблицу, где не требуется дать идентификатор записи, потому что его автоматически увеличивает MySQL.
mysql> CREATE TABLE ANDREYEX -> ( -> id INT UNSIGNED NOT NULL AUTO_INCREMENT, -> PRIMARY KEY (id), -> name VARCHAR(30) NOT NULL, # Тип -> date DATE NOT NULL, # Дата -> origin VARCHAR(30) NOT NULL # Цель ); Query OK, 0 rows affected (0.02 sec) mysql> INSERT INTO ANDREYEX (id,name,date,origin) VALUES -> (NULL,'promotion','2017-04-23','home'), -> (NULL,'millipede','2001-09-10','driveway'), -> (NULL,'grasshopper','2001-09-10','front yard'); Query OK, 3 rows affected (0.02 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM INSECT ORDER BY id; +----+-------------+------------+------------+ | id | name | date | origin | +----+-------------+------------+------------+ | 1 | housefly | 2001-09-10 | kitchen | | 2 | millipede | 2001-09-10 | driveway | | 3 | grasshopper | 2001-09-10 | front yard | +----+-------------+------------+------------+ 3 rows in set (0.00 sec)
LAST_INSERT_ID () является функцией SQL, так что вы можете использовать его из любого клиента, который понимает SQL запросы. В противном случае PERL и PHP скрипты обеспечивают исключительные функции для извлечения автоинкрементного значения последней записи.
Используйте атрибут mysql_insertid для получения значения AUTO_INCREMENT, генерируемого запроса. Этот атрибут доступен либо через handle базы данных или дескриптор, в зависимости от того, как оформить запрос. Следующий пример ссылается через handle базы данных.
$dbh->do ("INSERT INTO ANDREYEX (name,date,origin) VALUES('design','2017-04-24','home')"); my $seq = $dbh->{mysql_insertid};
После выдачи запроса, который генерирует значение AUTO_INCREMENT, получаем значение путем вызова функции mysql_insert_id().
mysql_query ("INSERT INTO ANDREYEX (name,date,origin) VALUES('design','2017-04-24','home')", $conn_id); $seq = mysql_insert_id ($conn_id);
Может быть случай, когда вы удалили много записей из таблицы, и вы хотите повторно проиндексировать последовательность всех записей. Это можно сделать с помощью простого трюка, но вы должны быть очень осторожны, чтобы сделать это, и проверить, имеет ли ваша таблица соединения с другой таблицей или нет.
Если вы определили необходимость переупорядочивания столбца AUTO_INCREMENT неизбежно, то это сделать надо так: удалить столбец из таблицы, а затем добавить его снова.
Следующий пример показывает, как изменить нумерацию значений идентификатора в таблице с помощью этой техники.
mysql> ALTER TABLE ANDREYEX DROP id; mysql> ALTER TABLE ANDREYEX -> ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT FIRST, -> ADD PRIMARY KEY (id);
По умолчанию MySQL запустит последовательность от 1, но вы можете указать любое другое число, в момент создания таблицы.
Следующий блок кода имеет пример, в котором MySQL начнет последовательность от 250.
mysql> CREATE TABLE ANDREYEX -> ( -> id INT UNSIGNED NOT NULL AUTO_INCREMENT = 250, -> PRIMARY KEY (id), -> name VARCHAR(30) NOT NULL, # Тип -> date DATE NOT NULL, # Дата -> origin VARCHAR(30) NOT NULL # Цель );
Кроме того, вы можете создать таблицу, а затем установить начальное значение последовательности с помощью ALTER TABLE.
mysql> ALTER TABLE t AUTO_INCREMENT = 250;
Мне кажется, что человек, который понимает язык этой статьи, уже знает ответ на вопрос, в чём разница между статическим и динамическим SQL. А я не понял. Я хотел понять, в чём разница между статическим и динамическим запросом. Яндекс даёт эту статью на первой странице в ответ на запрос “Что такое динамический запрос”. Вроде статья должна ответить на этот вопрос, но уровень явно для академиков.