1

请帮帮我

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

插入 :

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

谢谢。

4

3 回答 3

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);

输出:

| 身份证 | 动画 |
-------------
| 1 | 猪 |
| 2 | 猪 |

这是SQLFiddle演示

于 2013-08-20T16:08:14.707 回答
5

DEFAULT不会替换无效值,它只是定义在插入中未指定时使用的默认值。

于 2013-08-20T16:08:49.567 回答
3

+1 对@peterm 的回答,但 FWIW 这里有几种其他方式可以说明行为:

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

插入值 'root' 会导致空字符串而不是默认值的原因是,当您指定值时,默认值不会生效。

值 '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
于 2013-08-20T16:13:03.647 回答