添加主键以外的自增列

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

我有一个表,其中的键是主键。我想添加

seqNo
键,该键应该自动递增,但它不允许将其设置为自动递增。

因为已经有一个主键了,

是否可以让seqNo自动递增?目前

seqNo
不存在。我想添加它

mysql sql primary-key
4个回答
1
投票

SQL 表中不能有两个标识列,但您仍然可以创建序列。这是链接http://technet.microsoft.com/en-us/library/ff878091.aspx


1
投票

您有以下选择。

  1. 创建一个触发器,在每个插入语句上增加列值
  2. 使用序列,但一旦生成序列值,它将永远不会再次生成(这意味着,如果插入由于某种原因失败,您的值中将会出现间隙)

1
投票

Vignesh,请考虑以下事项...

 DROP TABLE IF EXISTS test;

 CREATE TABLE test 
 ( testID int(11) NOT NULL
 , string varchar(45) DEFAULT NULL
 , testInc int(11) NOT NULL AUTO_INCREMENT
 , PRIMARY KEY (testID)
 , KEY testInc (testInc)
 );

 INSERT INTO test
 (testID
 , string
 ) values 
 (1
 ,'Hello'
  );

 INSERT INTO test (testid,string) SELECT x.testid + y.max_test,string FROM test x JOIN (SELECT MAX(testid) max_test FROM test)y;
 INSERT INTO test (testid,string) SELECT x.testid + y.max_test,string FROM test x JOIN (SELECT MAX(testid) max_test FROM test)y;
 INSERT INTO test (testid,string) SELECT x.testid + y.max_test,string FROM test x JOIN (SELECT MAX(testid) max_test FROM test)y;
 Query OK, 4 rows affected (0.03 sec)

 SELECT * FROM test;
 +--------+--------+---------+
 | testID | string | testInc |
 +--------+--------+---------+
 |      1 | Hello  |       1 |
 |      2 | Hello  |       2 |
 |      3 | Hello  |       3 |
 |      4 | Hello  |       4 |
 |      5 | Hello  |       6 |
 |      6 | Hello  |       7 |
 |      7 | Hello  |       8 |
 |      8 | Hello  |       9 |
 +--------+--------+---------+

请注意,行数 (8) 和 testinc (9) 的值是不同的。这不是OP想要的。我用来生成 PK 的 MAX() 技巧也不好,因为它容易出现运行时错误。

相同的小提琴http://www.sqlfiddle.com/#!2/d29a5b/1

重点是...存储连续的 id 是没有意义的。


0
投票

自动增量和主键是不同的概念。是 RDBMS 造成了这个问题。

完全有可能拥有与自动增量列分开的主键。例如,主键可能由表中的多个字段组成。在这种情况下,auto_increment 没有任何意义。我们可以争论得脸色发青,但这些 ID 字段并不是真正的主键;它们是伪键,旨在为 DML 目的对表中的行进行唯一编号。主键是指使表中的数据对于表规范化而言唯一的因素。

MySQL中关于只允许单个列有auto_increment并强制它作为键的限制是一种错误的权宜之计。

在 MySQL 中执行此操作的一种方法是创建一个主键不是“id”的表,然后更改该表以添加唯一键约束:

CREATE TABLE protocol (id int not null, name varchar(30) not null primary key);
ALTER TABLE protocol ADD CONSTRAINT constraint_name UNIQUE(id);
ALTER TABLE protocol modify id int not null auto_increment;

这将为您提供一个 auto_increment id 和一个分配给不同列的主键。它可以与

一起使用
insert into protocol(id, name) values(0,'me');
insert into protocol(id, name) values(0,'you');
insert into protocol(id, name) values(0,'them');
© www.soinside.com 2019 - 2024. All rights reserved.