我有一个表,其中的键是主键。我想添加
seqNo
键,该键应该自动递增,但它不允许将其设置为自动递增。
因为已经有一个主键了,
是否可以让seqNo自动递增?目前
seqNo
不存在。我想添加它
SQL 表中不能有两个标识列,但您仍然可以创建序列。这是链接http://technet.microsoft.com/en-us/library/ff878091.aspx
您有以下选择。
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 是没有意义的。
自动增量和主键是不同的概念。是 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');