2013-03-31 5 views
4

У меня есть следующая таблица:Может ли первичный ключ быть пустым? Если да, то почему это изменило причину этого результата?

mysql> DESC my_contacts; 
+----------+-------------+------+-----+---------+-------+ 
| Field | Type  | Null | Key | Default | Extra | 
+----------+-------------+------+-----+---------+-------+ 
| id  | varchar(20) | NO | PRI |   |  | 
| location | varchar(20) | YES |  | NULL |  | 
| city  | varchar(20) | YES |  | NULL |  | 
| state | varchar(2) | YES |  | NULL |  | 
+----------+-------------+------+-----+---------+-------+ 
4 rows in set (0.01 sec) 

Если я избранная все, что я получаю:

mysql> SELECT * FROM my_contacts; 
+----+--------------+------+-------+ 
| id | location  | city | state | 
+----+--------------+------+-------+ 
| 1 | Chester,NJ | NULL | NULL | 
| 2 | Katy,TX  | NULL | NULL | 
| 3 | San Mateo,CA | NULL | NULL | 
+----+--------------+------+-------+ 
3 rows in set (0.00 sec) 

я запускаю следующую команду:

INSERT INTO my_contacts (city,state) 
VALUES 
(SUBSTRING_INDEX(location,',',1),RIGHT(location,2)); 

Моя цель была для заполнения столбцы city и state с запятой перед запятой и деталь после запятой из колонки location.
Но случился следующий к моему столику:

mysql> INSERT INTO my_contacts (city,state) 
    -> VALUES 
    -> (SUBSTRING_INDEX(location,',',1),RIGHT(location,2)); 
Query OK, 1 row affected (0.02 sec) 

mysql> SELECT * FROM my_contacts; 
+----+--------------+------+-------+ 
| id | location  | city | state | 
+----+--------------+------+-------+ 
| | NULL   | NULL | NULL | 
| 1 | Chester,NJ | NULL | NULL | 
| 2 | Katy,TX  | NULL | NULL | 
| 3 | San Mateo,CA | NULL | NULL | 
+----+--------------+------+-------+ 
4 rows in set (0.00 sec) 

я получаю запись и id, который является первичным ключом является пустым. Как это возможно?
Я имею в виду, что это не NULL, но первичный ключ не должен быть пустым ни правильным?

ответ

8

Вы определили свое поле id как varchar, что является немой идеей, когда вы используете его для хранения целых чисел. пустое поле NOT null. строка с нулевой длиной все еще является допустимой строкой и, следовательно, действительным значением id в отношении вашей таблицы. Попробуйте вставить ДРУГОЙ пустую строку, и вы получите первичный ключ нарушения:

INSERT INTO yourtable (id) VALUES (''); // will not work 

Поле id должно быть int типа. Это запретит «пустые» значения.

1

Это не пусто. Вероятно, это пустая строка. Обратите внимание, что тип данных - varchar (20).

2

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

1

Ну, вы не назначили значение для поля первичного ключа, поэтому значение по умолчанию - NULL. . Вы хотите изменить таблицу, чтобы первичный ключ был auto_increment.

+0

'default' является' 'NULL' для первичного key'? Как это возможно? Разве это не запрещено? – Cratylus

1

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

0

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

UPDATE my_contacts 
SET 
    city = substr(location, 1, locate(',', location) - 1), 
    state = substr(location, locate(',', location) + 1); 
Смежные вопросы