【发布时间】:2018-01-21 04:39:19
【问题描述】:
我有一张桌子(此处为简化示例):
CREATE TABLE msg
(
msg_id VARCHAR(30) NOT NULL,
user_id BIGINT NOT NULL,
message TEXT,
UNIQUE INDEX msg_index (msg_id, user_id);
);
我允许用户使用简单的 INSERT INTO 添加新消息,如下所示:
INSERT INTO msg (msg_id, user_id, message)
VALUES ($_POST["id"], $user["id"], $_POST["message"]);
一旦消息存在,我允许用户创建一个副本。语句很简单,我可以这样做:
INSERT INTO msg (msg_id, user_id, message)
SELECT CONCAT(msg_id, "_Copy") AS msg_id, user_id, message
WHERE msg_id = $_POST["id"];
第一次效果很好,只有当用户再次尝试对同一条消息执行 Duplicate 命令时,它才会因为 UNIQUE INDEX 约束而失败。
有没有办法更改CONTACT() 语句以生成唯一标识符(即“_Copy1”、“_Copy2”、...)或者我是否必须测试INSERT 是否成功,如果没有,请尝试再次与下一个可能的条目? (我知道该怎么做,我只是想知道 MySQL 是否提供了令人难以置信的功能,例如自动使一组列唯一,就像魔术一样!)
【问题讨论】:
-
是的,有一个很棒的功能叫做 AUTO_INCREMENT。也不要忘记转义您的用户输入。
-
@RolandStarke,事实上,我的实现知道
$_POST可能是有色的(即一个空的消息是无效的)。我也使用mysqli来处理特殊字符等问题,因为我使用的是bind()。但是对于这里的例子,我没有看到让它过于复杂的意义。 -
是的,我明白了。应该从你的分数中看到它......(我只是看了一眼你的个人资料,看到了 c++、c 和汇编,所以我想你可能会在 php 中写下你的第一行:D。
标签: php mysql unique-constraint