Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何根据列更改主键使其具有不同的自动增量_Mysql_Sql - Fatal编程技术网

Mysql 如何根据列更改主键使其具有不同的自动增量

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递增,当

我有一张桌子,叫做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递增,当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,并将其插入表中

@Sadikhasan:在这种情况下,如果用户不知道该怎么做,那么他可以尝试什么?拜托,不要只在每个你找不到的帖子上发表评论