2016-07-14 132 views
1

我的表結構insert not working on mysql 5.7.12-0?

CREATE TABLE IF NOT EXISTS `emp` (
`id` int(3) NOT NULL AUTO_INCREMENT, 
`name` varchar(11) DEFAULT NULL, 
`age` varchar(31) NOT NULL, 
PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ; 

我的查詢是:

INSERT INTO `emp` (`id`, `name`) VALUES ('1', 'prashant'); 

這正與所有的MySQL版本低於5.7,但不能與MySQL版本工作5.7.12-0ubuntu1

獲取錯誤:

#1364 - Field 'age' doesn't have a default value 

這個版本里有什麼新東西?

試試在5.7以下的mysql版本中,你會看到區別。

感謝:-)

+0

'Age'被定義爲'NOT NULL',但你是不是在你的'INSERT'爲它指定的值。聲明。您可能需要1)爲其設置一個'DEFAULT'值,或者2)將其添加到INSERT語句中。除了缺少「age」值之外,您還試圖「插入」一個「id」值,該值被定義爲「AUTO_INCREMENT」。 (另外,與你的錯誤無關,但'age'被定義爲'VARCHAR(31)'只是很奇怪......) – Siyual

+0

@Siyual它在5.7以下的所有mysql版本中工作,請在你的機器上嘗試一次:-) – unknownbits

+2

我知道沒有任何版本的MySQL允許你在聲明爲NOT NULL的字段中插入NULL。 – Siyual

回答

3

這將是一個巨大的驚喜,如果這在任何版本的mysql工作。複製粘貼到sqlfiddle.com(mysql 5.6或5.5)並自行確認。

age定義爲varchar(31)並且不爲空。因此,您的插入語句應該爲該列創建一個值。或者你應該給它一個默認值。在您處理它時,將其更改爲更適合的數據類型。

CREATE TABLE IF NOT EXISTS `emp` (
`id` int(3) NOT NULL AUTO_INCREMENT, 
`name` varchar(11) DEFAULT NULL, 
`age` int(3) NOT NULL default 0, 
PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ; 

更新時間:

想着這一些我認爲你已經在舊版本的MySQL關閉Strict Mode

嚴格模式控制MySQL的如何處理無效或遺漏值 數據更改語句,如INSERT或UPDATE。由於以下原因,值可能是 無效。例如,該列可能有錯誤的數據類型 ,或者它可能超出範圍。缺少值 當要插入的新行不包含非NULL 列的值時,該列的定義中沒有顯式的DEFAULT子句。 (對於 NULL列,如果值缺失,則插入NULL。)嚴格模式 也會影響DDL語句,例如CREATE TABLE。

所以我原來的說法是錯誤的!在字符串模式關閉的情況下,varchar的默認值可能是''(不確定是否從未使用嚴格模式關閉)

+2

關於嚴格模式的有趣點,從現在開始我會牢記這一點。正確答案,從我+1 +1! – Mjh

1

在你的餐桌年齡描述爲not null

`age` varchar(31) NOT NULL 

因此,它是插入的必填字段。

+0

你正在使用哪個版本的mysql? – unknownbits

+1

這不是版本。 –

0

NOT NULL約束強制字段始終包含一個值。這意味着您無法插入新記錄或更新記錄而無需向該字段添加值。您還必須在insert查詢中爲年齡賦予值,因爲它不能爲null。對於如: -

insert into emp(`id`,`name`,`age`) values('1','rahul','26') 

希望這有助於!!評論作進一步查詢