简体   繁体   English

有没有办法防止查询设置串行主键?

[英]Is there a way to prevent a query from setting the serial primary key?

I've got a bunch of tables with the 'serial' keyword on a primary key so that auto-increment will work.我有一堆在主键上带有“serial”关键字的表,这样自动增量就可以工作了。 The problem is that I can make a query to insert a row using any id number which overrides the auto-increment.问题是我可以使用覆盖自动增量的任何 id 号进行查询以插入一行。 Is there a reason for this?是否有一个原因? Or, is there a way to prevent a user from adding/changing this value?或者,有没有办法阻止用户添加/更改此值?

Here's an example of my table config:这是我的表配置示例:

create table if not exists departments (
    department_id serial primary key,
    name varchar(64) not null unique
);

if I run the following query, I can add any number to primary key:如果我运行以下查询,我可以向主键添加任何数字:

insert into departments (department_id, name) values (9001, 'FooBar')

I think I want to prevent this from happening.我想我想防止这种情况发生。 I'd like to get some opinions.我想得到一些意见。

Use an identity column:使用标识列:

create table if not exists departments (
    department_id integer primary key generated always as identity,
    name varchar(64) not null unique
);

This will prevent an insert to override the generated value.这将防止插入覆盖生成的值。 You can still circumvent that by specifying OVERRIDING SYSTEM VALUE as part of your INSERT statement.您仍然可以通过将OVERRIDING SYSTEM VALUE指定为 INSERT 语句的一部分来规避该问题。 But unless you specify that option, providing a value for the column will result in an error.但是除非您指定该选项,否则为该列提供值将导致错误。

Related: PostgreSQL: serial vs identity相关: PostgreSQL:串行与身份

Unless '9001' isn't already in the registers, it shouldn't cause any trouble.除非“9001”不在寄存器中,否则它不会造成任何麻烦。 If the filed 'department_id' is already auto increment you can just run your insert statement like如果提交的 'department_id' 已经是自动递增的,你可以像这样运行你的插入语句

INSERT INTO departments (name) VALUES ('FooBar')

I'm using Microsoft sql server and you can control the insert of value in identity column by below sql command我正在使用 Microsoft sql server,您可以通过以下 sql 命令控制在身份列中插入值

SET IDENTITY_INSERT [ [ database_name . SET IDENTITY_INSERT [ [数据库名称。 ] schema_name . ] 架构名称。 ] table_name { ON | ] table_name { ON | OFF }离开 }

By setting it to 'OFF' you cannot insert a value in identity column.通过将其设置为“OFF”,您无法在标识列中插入值。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM