loading..
Русский    English
17:15
листать

Вставка строк в таблицу, содержащую автоинкрементируемое поле стр. 3

MySQL

MySQL не поддерживает предложения DEFAULT VALUES. Вставить строку со значениями по умолчанию в таблицу можно другим стандартным способом, используя ключевое слово DEFAULT для каждого столбца таблицы - VALUES(DEFAULT, DEFAULT, ...).

А как здесь вставить очередное значение счетчика в единственный автоинкрементируемый столбец?

  1. CREATE TABLE test_Identity (
  2. id int(11) NOT NULL AUTO_INCREMENT,
  3.   PRIMARY KEY  (id)
  4. );
Очень просто. Оказывается будут работать те интуитивные приемы, которые мы безуспешно пытались применить в случае SQL Server, а именно, так

  1. INSERT INTO test_Identity VALUES();
или так

  1. INSERT INTO test_Identity VALUES(DEFAULT);

После выполнения обоих этих операторов получим:

id
1
2

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

  1. INSERT INTO test_Identity VALUES(8);
  2. INSERT INTO test_Identity VALUES(DEFAULT);
  3. SELECT * FROM test_Identity;

id
1
2
8
9

PostgreSQL

  1. CREATE TABLE identity_table(id serial PRIMARY KEY);

Для вставки очередных значений счетчика мы можем воспользоваться следующими рассмотренными выше приемами:

  1. INSERT INTO identity_table DEFAULT VALUES;
  2. INSERT INTO identity_table VALUES(DEFAULT);
  3. INSERT INTO identity_table(id) VALUES(DEFAULT);
  4. SELECT * FROM identity_table;

id
1
2
3

Однако, если вставить конкретное значение (превышающее максимальное значение, достигнутое счетчиком)

  1. INSERT INTO identity_table(id) VALUES(5);
и продолжить заполнять значения счетчика, 

  1. INSERT INTO identity_table VALUES(DEFAULT);
то нумерация продолжается не с максимального значения, а с последнего достигнутого при генерации: 

id
1
2
3
5
4

При этом, когда счетчик достигает 5 при генерации очередного значения, получаем ошибку, связанную с нарушением ограничения первичного ключа:

ERROR:  duplicate key value violates unique constraint "identity_table_pkey"

DETAIL:  Key (id)=(5) already exists.


Если же таблица не имеет ключа на автоинкрементируемом столбце, то мы получим дубликаты, после чего нумерация продолжится дальше. Вот скрипт, который поясняет сказанное:

  1. CREATE TABLE identity_table_wo(id serial);
  2. INSERT INTO identity_table_wo(id) VALUES(DEFAULT);
  3. INSERT INTO identity_table_wo(id) VALUES(2);
  4. INSERT INTO identity_table_wo(id) VALUES(DEFAULT),(DEFAULT);
  5. SELECT * FROM identity_table_wo;

id
1
2
2
3

Страницы: 1 2 3 4 5
Тэги:
ALL AND AUTO_INCREMENT AVG battles CASE CAST CHAR CHARINDEX CHECK classes COALESCE CONSTRAINT Convert COUNT CROSS APPLY CTE DATEADD DATEDIFF DATENAME DATEPART DATETIME DDL DEFAULT DELETE DISTINCT DML EXCEPT EXISTS EXTRACT FOREIGN KEY FROM FULL JOIN GROUP BY Guadalcanal HAVING IDENTITY IN INFORMATION_SCHEMA INNER JOIN insert INTERSECT IS NOT NULL IS NULL ISNULL laptop LEFT LEFT OUTER JOIN LEN maker Больше тэгов
Учебник обновлялся
несколько дней назад
https://exchangesumo.com/obmen/TRX-TRX/
©SQL-EX,2008 [Развитие] [Связь] [О проекте] [Ссылки] [Team]
Перепечатка материалов сайта возможна только с разрешения автора.