2012-11-13 69 views
1

我不知道它是數據庫還是什麼問題。對於所有在我的數據庫被聲明爲的主鍵的表中,列在表由emp_id(primary key), emp_name, emp_addr, emp_contact and salary正在NULL值或默認值時,查詢像防止null值被插入到主鍵列的表中

INSERT INTO TABLE (emp_name,emp_addr,emp_contact,salary) 
values ('Jack','127 N F 14 Stillwater','3456786543',8) 

如果我試圖插入一個元組

INSERT INTO EMPLOYEE values (NULL,'Jack','127 N F 14 Stillwater','345678543',8) 

,它拋出的錯誤是主鍵不能是被認爲是零。

我的表創建腳本..

create table Employee(
    emp_id int(11) primary key, 
    emp_name varchar(25) not null, 
    emp_addr varchar(40) not null, 
    emp_contact varchar(10), 
    salary float(2) 
    )ENGINE=INNODB; 

This is what is happening in my DB 
create table sale(sale_id varchar(10) primary key not null,sold_vehicle varchar(12),sm_id int(11),                sale_date date)ENGINE=INNODB; 
Query OK, 0 rows affected (0.01 sec) 

mysql> insert into sale values('s2389','AP28DJ5093',1290,'05-12-2010'); 
Query OK, 1 row affected, 1 warning (0.00 sec) 

mysql> insert into sale values('s2420','AP28MY0545',1290,'24-10-2012'); 
Query OK, 1 row affected, 1 warning (0.00 sec) 

mysql> select * from sale; 
+---------+--------------+-------+------------+ 
| sale_id | sold_vehicle | sm_id | sale_date | 
+---------+--------------+-------+------------+ 
| s2389 | AP28DJ5093 | 1290 | 0000-00-00 | 
| s2420 | AP28MY0545 | 1290 | 0000-00-00 | 
+---------+--------------+-------+------------+ 
2 rows in set (0.00 sec) 

mysql> update sale set sale_id = null where sale_id = 's2389'; 
Query OK, 1 row affected, 1 warning (0.01 sec) 
Rows matched: 1 Changed: 1 Warnings: 1 

mysql> select * from sale; 
+---------+--------------+-------+------------+ 
| sale_id | sold_vehicle | sm_id | sale_date | 
+---------+--------------+-------+------------+ 
|   | AP28DJ5093 | 1290 | 0000-00-00 | 
| s2420 | AP28MY0545 | 1290 | 0000-00-00 | 
+---------+--------------+-------+------------+ 
2 rows in set (0.00 sec) 

mysql> desc sale; 
+--------------+-------------+------+-----+---------+-------+ 
| Field  | Type  | Null | Key | Default | Extra | 
+--------------+-------------+------+-----+---------+-------+ 
| sale_id  | varchar(10) | NO | PRI | NULL |  | 
| sold_vehicle | varchar(12) | YES |  | NULL |  | 
| sm_id  | int(11)  | YES |  | NULL |  | 
| sale_date | date  | YES |  | NULL |  | 
+--------------+-------------+------+-----+---------+-------+ 
4 rows in set (0.00 sec) 
+0

你確定你沒有在主鍵上自動遞增? –

+1

爲什麼不是你的主鍵不爲空 – smk

回答

0

您創建表添加AUTO_INCREMENT選項

create table Employee 
(
emp_id int(11) AUTO_INCREMENT primary key, 
emp_name varchar(25) not null, 
emp_addr varchar(40) not null, 
emp_contact varchar(10), 
salary float(2) 
)ENGINE=INNODB; 
+0

但我不需要自動增加那個鍵..不能我有這個選項? –

+0

如果是這種情況,那麼刪除'AUTO_INCREMENT'並在其上提供一個ID。 INSERT INTO EMPLOYEE值(1,'Jack','127 NF 14 Stillwater','345678543',8)' –

2

你不能有一個主鍵字段爲空。主鍵不能爲空。否則,主鍵有什麼意義? :)請更改您創建查詢這樣的:

CREATE table tblblah(ID NOT NULL PRIMARY KEY, ...等等

; 

INSERT INTO table tblblah(ID, .. ..和等

; 

根據你的表架構填充它。

+0

如果您沒有指定您自己的ID字段值(例如員工IC號碼,員工號碼等),那麼在上面包含AUTO_INCREMENT子句是個好主意。 – bonCodigo

+0

但主鍵本身是非空屬性。並且它在desc表中顯示爲NULL下的NO ...我們是否需要明確地給出該約束?我認爲我們不需要..糾正我,如果我錯了 –

+0

在MYSQL是的,它不是必須把NOT NULL。當然PK在本質上是一個'非空'屬性。即使你沒有用'not null'約束你的字段,pk也不應該允許空值。這就是爲什麼你會得到一個錯誤。 (例如,在你的第二個INSERT查詢中,主鍵爲NULL)由於你不需要自動增加,但是插入了你自己的值,所以它非常安全並且保持你的表的完整性以具有顯式的'非空'約束 - 所以你不需要取決於SQL引擎 - 以避免你在這裏遇到的問題。 [參考文獻](http://stackoverflow.com/questions/3905703/why-to-use-not-null-primary-key-in-tsql) – bonCodigo

相關問題