Mysql 如何根据列更改主键使其具有不同的自动增量
我有一张桌子,叫做q_位置Mysql 如何根据列更改主键使其具有不同的自动增量,mysql,sql,Mysql,Sql,我有一张桌子,叫做q_位置 CREATE TABLE `q_locations` ( `id` int(11) NOT NULL, `name` varchar(300) NOT NULL, `standalone` bit(1) NOT NULL DEFAULT b'0', UNIQUE KEY `id` (`id`), KEY `standalone` (`standalone`) ) 我希望当standalone=0时,id从0递增,当
CREATE TABLE `q_locations` (
`id` int(11) NOT NULL,
`name` varchar(300) NOT NULL,
`standalone` bit(1) NOT NULL DEFAULT b'0',
UNIQUE KEY `id` (`id`),
KEY `standalone` (`standalone`)
)
我希望当standalone=0时,id从0递增,当standalone=1时,id从1000递增,这样做是否可行,以及如何实现?这是可能的,但不是自动的。传统的方法是使用触发器来设置值 然而,我认为你不应该走这条路。自动递增的主键不应具有与其关联的含义。它不是对其他信息的编码;它只是分配给一行的一个数字(通常按插入顺序,尽管可能有间隙) 如果要枚举
独立
的值,请在查询中而不是在主键列中进行
编辑:
触发器将类似于:
DELIMITER $$
CREATE TRIGGER trigger_insert_q_locations
BEFORE INSERT ON q_locations
FOR EACH ROW
BEGIN
SELECT coalesce(max(id) + 1, (case when standalone = 0 then 0 else 1000 end)) into NEW.id
FROM q_locations
WHERE standalone = NEW.standalone;
END$$
请注意,这将处理
insert
。如果在记录上更新了独立的值,则数据将不正常。这是可能的,但不是自动的。传统的方法是使用触发器来设置值
然而,我认为你不应该走这条路。自动递增的主键不应具有与其关联的含义。它不是对其他信息的编码;它只是分配给一行的一个数字(通常按插入顺序,尽管可能有间隙)
如果要枚举独立
的值,请在查询中而不是在主键列中进行
编辑:
触发器将类似于:
DELIMITER $$
CREATE TRIGGER trigger_insert_q_locations
BEFORE INSERT ON q_locations
FOR EACH ROW
BEGIN
SELECT coalesce(max(id) + 1, (case when standalone = 0 then 0 else 1000 end)) into NEW.id
FROM q_locations
WHERE standalone = NEW.standalone;
END$$
请注意,这将处理
insert
。如果在记录上更新了独立的值,则数据将不正常。这是可能的,但不是自动的。传统的方法是使用触发器来设置值
然而,我认为你不应该走这条路。自动递增的主键不应具有与其关联的含义。它不是对其他信息的编码;它只是分配给一行的一个数字(通常按插入顺序,尽管可能有间隙)
如果要枚举独立
的值,请在查询中而不是在主键列中进行
编辑:
触发器将类似于:
DELIMITER $$
CREATE TRIGGER trigger_insert_q_locations
BEFORE INSERT ON q_locations
FOR EACH ROW
BEGIN
SELECT coalesce(max(id) + 1, (case when standalone = 0 then 0 else 1000 end)) into NEW.id
FROM q_locations
WHERE standalone = NEW.standalone;
END$$
请注意,这将处理
insert
。如果在记录上更新了独立的值,则数据将不正常。这是可能的,但不是自动的。传统的方法是使用触发器来设置值
然而,我认为你不应该走这条路。自动递增的主键不应具有与其关联的含义。它不是对其他信息的编码;它只是分配给一行的一个数字(通常按插入顺序,尽管可能有间隙)
如果要枚举独立
的值,请在查询中而不是在主键列中进行
编辑:
触发器将类似于:
DELIMITER $$
CREATE TRIGGER trigger_insert_q_locations
BEFORE INSERT ON q_locations
FOR EACH ROW
BEGIN
SELECT coalesce(max(id) + 1, (case when standalone = 0 then 0 else 1000 end)) into NEW.id
FROM q_locations
WHERE standalone = NEW.standalone;
END$$
请注意,这将处理
insert
。如果在记录上更新了standalone
的值,则数据将不正常。双向自动递增是不可能的,但您可以使用以下逻辑手动实现此方案
对于第一个条目:
- 在将值插入表之前
- 检查standalone的值
- 如果为0,则插入0或1000
- 在将值插入表之前
- 检查standalone的值
- 如果为0,则使用where condition standalone=0获取id列的最大值
- 否则,如果为1,则使用where condition standalone=1获取id列的最大值
- 然后将id增加1,并将其插入表中
- 在将值插入表之前
- 检查standalone的值
- 如果为0,则插入0或1000
- 在将值插入表之前
- 检查standalone的值
- 如果为0,则使用where condition standalone=0获取id列的最大值
- 否则,如果为1,则使用where condition standalone=1获取id列的最大值
- 然后将id增加1,并将其插入表中
- 在将值插入表之前
- 检查standalone的值
- 如果为0,则插入0或1000
- 在将值插入表之前
- 检查standalone的值
- 如果为0,则使用where condition standalone=0获取id列的最大值
- 否则,如果为1,则使用where condition standalone=1获取id列的最大值
- 然后将id增加1,并将其插入表中
- 在将值插入表之前
- 检查standalone的值
- 如果为0,则插入0或1000
- 在将值插入表之前
- 检查standalone的值
- 如果为0,则使用where condition standalone=0获取id列的最大值
- 否则,如果为1,则使用where condition standalone=1获取id列的最大值
- 然后将id增加1,并将其插入表中