我有下面的表格结构:
CREATE TABLE Table_1(
id int AutoIncrement PRIMARY KEY,
message varchar(64) NOT NULL DEFAULT 'NA'
)
我运行以下查询:
INSERT INTO Table_1 (id, message) VALUES (null, null);
它给了我错误:
Error Code: 1048. Column 'message' cannot be null
我想要使用相同的插入查询得到以下结果。
|id | message|
|1 | NA |
有MySQL设置吗? 谢谢
你的问题乍一看很棘手,因为从概念上讲,你想要在不指定主键值或消息的情况下进行插入,而不是完全依赖MySQL来提供默认值。
要插入空行,只需指定主键列以及用于
NULL
的单个 VALUES
:
CREATE TABLE Table_1(
id int PRIMARY KEY AUTO_INCREMENT,
message varchar(64) NOT NULL DEFAULT 'NA'
);
INSERT INTO Table_1 (id) VALUES (NULL);
SELECT * FROM Table_1;
输出:
id | message
1 1 | NA
演示在这里:
你有一些语法错误,这会起作用。
CREATE TABLE Table_1(
id int NOT NULL AUTO_INCREMENT,
message varchar(64) DEFAULT 'NA',
PRIMARY KEY (id)
)
如果你想增加价值
Null
你不应该在你的表结构中添加这个约束。
COALESCE
函数与 DEFAULT
组合可用于将 NULL
值转换为为表列定义的任何默认值。这是因为 COALESCE
将返回其参数列表中的第一个非空元素。尽管OP的INSERT
会产生错误,但从概念上讲,该语句可以重写为:
INSERT INTO Table_1 (id, message) VALUES (null, COALESCE(null, DEFAULT(message)))
OP 没有说,但如果该语句是由接收
message
作为参数的函数生成的:
function PutMessage(msg)
Query("INSERT INTO Table_1 (id, message) VALUES (null,
COALESCE(msg, DEFAULT(message)))")
在 PHP 中,使用 mysqli 和准备好的语句:
// NOTE: Keep this configuration hidden somewhere else
$DbServer = "...";
$DbUser = "...";
$DbPass = "...";
$DbName = "...";
// Attempts to create a connection
$conn = new mysqli($DbServer, $DbUser, $DbPass, $DbName);
if ($conn->connect_error) ERROR
// Prepares an INSERT statement
$stmt = $conn->prepare("INSERT INTO Table_1 "
"(id, message) VALUES (?, COALESCE(?, DEFAULT(message)))");
$stmt->bind_param("is", $id, $message);
// Inserts null message
$id = null;
$message = null;
$stmt->execute();
// Inserts a non null message
$id = null;
$message = "This is a non-null message";
$stmt->execute();
// Cleans everything up
$stmt->close();
$conn->close();
这也增加了代码注入预防。