有没有一种方法可以防止查询设置串行主键?

时间:2020-02-18 17:00:06

标签: sql postgresql

我有一堆带有主键上的'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')

我想我想防止这种情况的发生。我想征求意见。

3 个答案:

答案 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来规避此问题。但是除非您指定该选项,否则为列提供值将导致错误。

相关:PostgreSQL: serial vs identity

答案 1 :(得分:0)

除非'9001'不在寄存器中,否则不会造成任何麻烦。 如果归档的'department_id'已经是自动递增的,则只需运行

这样的插入语句即可。
INSERT INTO departments (name) VALUES ('FooBar')

答案 2 :(得分:-1)

我正在使用Microsoft sql服务器,您可以通过以下sql命令控制在标识列中插入值

SET IDENTITY_INSERT [[数据库名称。 ] schema_name。 ] table_name {开|关闭}

通过将其设置为“ OFF”,您不能在“身份”列中插入值。

有关更多信息,请参见:https://docs.microsoft.com/en-us/sql/t-sql/statements/set-identity-insert-transact-sql?view=sql-server-ver15