在数据库(DBMS)中,IDENTITY
属性用于创建自增列,这些列会自动生成唯一的数值。在这种情况下,如果尝试手动插入值到自增列,会导致错误,除非明确设置 IDENTITY_INSERT
为 ON
。 IDENTITY_INSERT
属性的默认值为 OFF。SET IDENTITY_INSERT
的设置是在执行或运行时进行的。当一个连接结束,IDENTITY_INSERT 属性将被自动还原为 OFF;
DM 提供两种自增方式:IDENTITY 自增列和 AUTO_INCREMENT 自增列。与IDENTITY 自增列 不同的是,AUTO_INCREMENT 自增列允许隐式和显示插入自增列值,只要不违反主键的唯一性约束。
示例如下:
CREATE TABLE TEST_IDENTITY (
ID INT IDENTITY(1,1), -- 自增列
NAME VARCHAR(50)
);
INSERT INTO TEST_IDENTITY (NAME) VALUES ('Alice');
INSERT INTO TEST_IDENTITY (NAME) VALUES ('Bob');
COMMIT;
-- 报错-2723: 仅当指定列列表,且SET IDENTITY_INSERT为ON时,才能对自增列赋值
INSERT INTO TEST_IDENTITY (ID, NAME) VALUES (3, 'Charlie');
COMMIT;
-- 设置 IDENTITY_INSERT 为 ON
SET IDENTITY_INSERT TEST_IDENTITY ON;
-- 插入自增列的值(成功)
INSERT INTO TEST_IDENTITY (ID, Name) VALUES (3, 'Charlie');
-- 关闭 IDENTITY_INSERT
SET IDENTITY_INSERT TEST_IDENTITY OFF;
CREATE TABLE TEST_AUTOINCREMENT (
ID INT AUTO_INCREMENT,
NAME VARCHAR(50),
PRIMARY KEY(ID)
);
--隐式插入
INSERT INTO TEST_AUTOINCREMENT (NAME) VALUES ('Alice');
INSERT INTO TEST_AUTOINCREMENT (NAME) VALUES ('Bob');
--显示插入
INSERT INTO TEST_AUTOINCREMENT (ID,NAME) VALUES (3,'Bob');
COMMIT;
如果确认使用IDENTITY自增列,建议会话设置 IDENTITY_INSERT
为 ON
。
在MySQL移植DM时经常出现这个问题,原因是默认迁移自增列时使用IDENTITY定义了自增列,导致后面显示插入报错。版本高一些的迁移工具可选择使用AUTO_INCREMENT自增列解决此问题。
文章
阅读量
获赞