【发布时间】:2017-08-11 16:52:48
【问题描述】:
我有一个 MySQL 表。我必须能够为不是 AUTO_INCREMENT 列的速度添加唯一的 INT 值。
CREATE TABLE ki
(
id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT
, comp_id INT(10) UNSIGNED NOT NULL
, speed INT(4) UNSIGNED NOT NULL DEFAULT 0
, position INT(4) UNSIGNED NOT NULL DEFAULT 0
, PRIMARY KEY (id)
, UNIQUE INDEX (comp_id, speed, position)
, INDEX (comp_id)
, FOREIGN KEY (comp_id)
REFERENCES competitions (id)
ON DELETE NO ACTION
ON UPDATE CASCADE
) ENGINE=InnoDB CHARACTER SET latin1 COLLATE latin1_swedish_ci;
我想插入新行。
INSERT INTO ki (comp_id, speed, position) VALUES (1, 1, 0)
INSERT INTO ki (comp_id, speed, position) VALUES (1, 2, 0)
INSERT INTO ki (comp_id, speed, position) VALUES (1, 3, 0)
INSERT INTO ki (comp_id, speed, position) VALUES (1, 3, 0) -- error
INSERT INTO ki (comp_id, speed, position) VALUES (2, 1, 0)
INSERT INTO ki (comp_id, speed, position) VALUES (2, 3, 0)
INSERT INTO ki (comp_id, speed, position) VALUES (2, 2, 0)
每个 comp_id 的 speed 值从 1 开始。speed 值应始终为 comp_id 的最大速度值 + 1。
如果(1, 3, 0) 已经存在,插入应该是(1, max(speed) where comp_id = 1, 0)。换句话说,(1, 4, 0)。
我不想修改现有的行。
如何在我的 SQL 查询中执行此操作?如前所述,速度必须是唯一的,如果同时有多个插入,这必须有效。
如果同时有多个插入,以下方式是否有效并保证唯一的速度值(从 1 开始的值)?
INSERT INTO ki (comp_id, speed, position)
VALUES (
1,
COALESCE((SELECT MAX(ki2.speed)
FROM ki AS ki2
WHERE ki2.comp_id = 1
), 1) + 1,
0
)
【问题讨论】:
-
我还在寻求帮助。
-
仍在寻求帮助...
-
如果速度必须是唯一的,那就在上面放一个唯一的索引。
-
@HLGEM 不同的 comp_id 可以有相同的速度值。