如果 Maria db 中的值为空,如何将默认值插入到非空列中

问题描述 投票:0回答:3

我有下面的表格结构:

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设置吗? 谢谢

insert mariadb default notnull
3个回答
1
投票

你的问题乍一看很棘手,因为从概念上讲,你想要在不指定主键值消息的情况下进行插入,而不是完全依赖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

演示在这里:

Rextester


0
投票

你有一些语法错误,这会起作用。

CREATE TABLE Table_1(
    id int NOT NULL AUTO_INCREMENT,
    message varchar(64) DEFAULT 'NA',
    PRIMARY KEY (id)
)

如果你想增加价值

Null
你不应该在你的表结构中添加这个约束。


0
投票

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

这也增加了代码注入预防。

© www.soinside.com 2019 - 2024. All rights reserved.