我有一堆带有主键上的'serial'关键字的表,这样自动增量将起作用。问题是我可以使用覆盖自动递增的任何ID号进行查询以插入行。是否有一个原因?还是有一种方法可以防止用户添加/更改此值?
这是我的表配置示例:
create table if not exists departments (
department_id serial primary key,
name varchar(64) not null unique
);
如果我运行以下查询,则可以在主键上添加任意数字:
insert into departments (department_id, name) values (9001, 'FooBar')
我想我想防止这种情况的发生。我想征求意见。
答案 0 :(得分:2)
使用身份列:
create table if not exists departments (
department_id integer primary key generated always as identity,
name varchar(64) not null unique
);
这将防止插入内容覆盖生成的值。您仍然可以通过在INSERT语句中指定OVERRIDING SYSTEM VALUE
来规避此问题。但是除非您指定该选项,否则为列提供值将导致错误。
答案 1 :(得分:0)
除非'9001'不在寄存器中,否则不会造成任何麻烦。 如果归档的'department_id'已经是自动递增的,则只需运行
这样的插入语句即可。INSERT INTO departments (name) VALUES ('FooBar')
答案 2 :(得分:-1)
我正在使用Microsoft sql服务器,您可以通过以下sql命令控制在标识列中插入值
SET IDENTITY_INSERT [[数据库名称。 ] schema_name。 ] table_name {开|关闭}
通过将其设置为“ OFF”,您不能在“身份”列中插入值。