2013-08-20 38 views
1

请帮助我DEFAULT不组数据工作

CREATE TABLE RET (anim SET('dog','pig','voon') DEFAULT 'pig'); 

插入:

INSERT INTO RET VALUES('root') //empty string! Why? DEFAULT doesn't work! 

感谢。

回答

5

DEFAULT不会替换无效值,它只是定义了默认值,如果在插入没有指定的使用。

+0

完美答案。谢谢 –

+0

如果在插入中指定为NULL,该怎么办? NULL值是否被替换为默认值? – Jorrit

+0

@Jorrit'null'是一个值,所以它将被用来代替默认值。小提琴在这里:http://sqlfiddle.com/#!9/ea8037/1 – Joe

6

它的工作原理应该如此。 更改您的架构是这样,例如

CREATE TABLE RET (id int, anim SET('dog','pig','voon') DEFAULT 'pig'); 

然后省略anim列在您的插入

INSERT INTO ret (id) VALUES(1); 

或者使用DEFAULT关键字

INSERT INTO ret (id, anim) VALUES(2, DEFAULT); 

输出:

 
| ID | ANIM | 
------------- 
| 1 | pig | 
| 2 | pig | 

这里是SQLFiddle演示

3

+1到@ peterm的答案,但FWIW这里有一些其他的方法可以说明行为:

INSERT INTO ret (anim) VALUES (DEFAULT); 
INSERT INTO ret() VALUES(); 

之所以插入,而不是一个空字符串值“根”的结果默认值是默认值在您指定值时未启动。

值'root'不是SET定义中的有效条目之一,但在默认行为下,MySQL“截断”无效值并插入一个空集。它在截断无效值时会生成警告,但不会阻止INSERT的发生。

您可以设置严格模式以禁用自动截断。这将警告转化为错误,并且INSERT将失败。

mysql> SET SQL_MODE=STRICT_ALL_TABLES; 
mysql> INSERT INTO RET VALUES('root'); 
ERROR 1265 (01000): Data truncated for column 'anim' at row 1 
+0

好评:“MySQL”截断“无效值,并插入一个空集。”坦克为你提供帮助。 –