2015-04-11 2 views
2

Это мой код (уникальный ключ):Создание SQL таблицы позволяют NULL

CREATE TABLE table(
     id int(1) UNIQUE, 
     name varchar(128) NOT NULL) 

ALTER TABLE table ADD UNIQUE KEY id (id); 

Я не уверен, если мне нужно второе утверждение или нет, но в любом случае она не работает при вставке INSERT INTO table (name) VALUES ("test"). Он говорит, что table.id не может быть NULL. Что мне нужно сделать, чтобы заставить его работать с NULL (и Auto Increment?) Замена первого столбца на id int(1) NOT NULL AUTO_INCREMENT, заставляет его сказать синтаксическую ошибку.

+0

Пожалуйста, отметьте свой вопрос в базе данных, которую вы используете. Некоторые базы данных позволяют использовать NULL в уникальных ключах, некоторые - нет. По-видимому, стандарт неясен в этом вопросе. И вам не нужно второе утверждение. «Уникальное» ключевое слово и оператор 'alter table' делают почти то же самое. –

+0

Ок, я думаю, я удалю часть alter table. И я использую SQLLite. – g19992

+0

'id INT PRIMARY KEY' –

ответ

1

Столбец должен быть быть ПЕРВИЧНЫМ КЛЮЧОМ INTEGER для autoincrement behavior.

  1. автоинкрементных ключевое слово вводит дополнительный процессор, память, дисковое пространство, и диск над головой I/O и его следует избегать, если не строго необходимо. Обычно это не нужно.

  2. В SQLite, столбец с типом INTEGER PRIMARY KEY является псевдонимом для ROWID (за исключением без таблиц RowId), который всегда является 64-разрядное целое число

  3. на вставке, если ROWID или INTEGER PRIMARY KEY столбец явно не задан, то она будет заполнена автоматически неиспользуемым целым ..

  4. Если AUTOINCREMENT ключевого слово появляется после того, как INTEGER PRIMARY KEY, которая изменяет алгоритм автоматического присваивания ROWID, чтобы предотвратить повторное использование ROWID за время существования базы данных. Другими словами, целью AUTOINCREMENT является предотвращение повторного использования ROWID из ранее удаленных строк.

Уникальным является недостаточным, чтобы вызвать такое поведение; и использование AUTOINCREMENT требуется для обеспечения монотонной схемы приращения.

Таким образом, чтобы выставить суррогатной ROWID без гарантию того, что ID никогда не будет использован повторно, используйте:

id INTEGER PRIMARY KEY 

Для обеспечения ID никогда не повторно за столом жизни/базы данных (что является MySQL автоинкремент и SQL Server тождественное поведение столбца), используйте:

id INTEGER PRIMARY KEY AUTOINCREMENT 

No other types or can be used for this behavior - это включает в себя INT, несмотря на то, что в конечном итоге с той же близости.

+0

Вам также нужно «автоинкремент», не так ли? –

+0

Извините, это означает, что я должен ввести id int (1) NOT NULL INTEGER PRIMARY KEY или просто NOT NULL PRIMARY KEY? – g19992

+0

@a_horse_with_no_name Я обновил ответ с дополнительной информацией о том, как это влияет на поведение. Спасибо, что указали разницу. – user2864740

Смежные вопросы