PRIMARY KEY主键和IDENTITY属性函数的区别

1 PRIMARY KEY 约束

表通常具有包含唯一标识表中每一行的值的一列或一组列。这样的一列或多列称为表的主键 (PK),用于强制表的实体完整性。在创建或修改表时,您可以通过定义 PRIMARY KEY约束来创建主键。一个表只能有一个PRIMARY KEY 约束。如果已存在 PRIMARY KEY 约束,则可以修改或删除它。例如,可以让表的 PRIMARY KEY 约束引用其他列,更改列的顺序、索引名、聚集选项或 PRIMARY KEY 约束的填充因子。但是,不能更改使用 PRIMARY KEY 约束定义的列长度。

[转载]PRIMARY <wbr>KEY主键和IDENTITY属性函数的区别注意:
若要修改 PRIMARY KEY 约束,必须先删除现有的 PRIMARY KEY 约束,然后再用新定义重新创建该约束。

为表中的现有列添加 PRIMARY KEY 约束时,SQL Server 2005 Database Engine 将检查现有列的数据和元数据以确保主键符合以下规则:

  • 列不允许有空值。
    创建表时指定的 PRIMARY KEY 约束列隐式转换为 NOT NULL。
  • 不能有重复的值。
    如果为具有重复值或允许有空值的列添加 PRIMARY KEY 约束,则数据库引擎 将返回一个错误并且不添加约束。

不能添加违反以上规则的 PRIMARY KEY 约束。

数据库引擎 会自动创建唯一的索引来强制实施 PRIMARY KEY 约束的唯一性要求。如果表中不存在聚集索引或未显式指定非聚集索引,则将创建唯一的聚集索引以强制实施 PRIMARY KEY 约束。

如果存在以下情况,则不能删除 PRIMARY KEY 约束:

  • 如果另一个表中的 FOREIGN KEY 约束引用了 PRIMARY KEY 约束,则必须先删除 FOREIGN KEY 约束。
  • 表包含应用于自身的 PRIMARY XML 索引。

一个表只能有一个 PRIMARY KEY 约束,并且 PRIMARY KEY约束中的列不能接受空值。由于 PRIMARY KEY 约束可保证数据的唯一性,因此经常对标识列定义这种约束。

如果为表指定了 PRIMARY KEY 约束,则 SQL Server 2005 Database Engine 将通过为主键列创建唯一索引来强制数据的唯一性。当在查询中使用主键时,此索引还可用来对数据进行快速访问。因此,所选的主键必须遵守的规则。

如果对多列定义了 PRIMARY KEY 约束,则一列中的值可能会重复,但来自 PRIMARY KEY 约束定义中所有列的任何值组合必须唯一。

 

  (1) 在数据库中创建主键:

    在表设计器中,单击要定义为主键的数据库列的行选择器。若要选择多个列,请在单击其他列的行选择器时按住 Ctrl 键。

<//ddue.schemas.microsoft.com/authoring/2003/5:content xmlns="http://ddue.schemas.microsoft.com/authoring/2003/5">  <///ddue.schemas.microsoft.com/authoring/2003/5:content>右键单击该列的行选择器,然后选择“设置主键”。此时,将自动创建名为“PK_”(后跟表名)的主键索引,您可以在“索引/键”对话框中看到该索引。

 (2)使用SQL语句创建主键约束
使用SQL语句创建主键约束可以在创建表(Create Table)或修改表(Alter Table)时进行 创建。
在修改表中创建主键约束语法:
ALTER TABLE table_name
ADD
CONSTRAINT constraint_name
PRIMARY KEY [CLUSTERED | NONCLUSTERED]
{(Column[,…n])}
参数说明:
 CONSTRAINT:创建约束的关键字。
 constraint_name:创建约束的名称。
 PRIMARY KEY:表示所创建约束的类型为主键约束。
 CLUSTERED | NONCLUSTERED:是表示为PRIMARY KEY或UNIQUE约束创建聚集或非聚集索引的关键字。PRIMARY KEY约束默认为CLUSTERED,UNIQUE约束默认为 NONCLUSTERED。

 (3) 建表时创建PRIMARY KEY约束

CREATE TABLE mytable   --创建表
(
USERID int CONSTRAINT pk_id PRIMARY KEY,   --创建主键约束
USERNAME char (20),   --数据列

)

说明:在上段代码中,CONSTRAINT pk_id PRIMARY KEY为创建一个主键约束,pk_id为用户自定义的主键约束名称,但名称必须是合法的标识符。
  (4)添加PRIMARY KEY约束列

SQL语句如下:
ALTER TABLE mytable    --修改表
ADD    
CONSTRAINT pk_level
PRIMARY KEY CLUSTERED (userID)
GO --此时创建了一个pk_level聚集索引
说明:将某个数据列设置为主键约束时,该数据列不能为允许空,否则将会无法创建主键约束。
可以在查询分析器中写入如下代码将数据列设置为不允许空。
ALTER TABLE mytable    --修改表
ALTER Column USERLEVEL char (2) NOT NUL --将USERLEVEL数据列设置为不允许空

 

   (5) 删除PRIMARY KEY主键约束

通过删除主键约束来自动删除由该主键约束创建出来的聚集索引
alter table t drop constraint pk_level



2 IDENTITY(属性)(Transact-SQL)

在表中创建一个标识列。此属性与 CREATE TABLE 及 ALTER TABLE Transact-SQL 语句一起使用。

 

 

以下示例将使用 IDENTITY 属性,为自动递增标识号创建一个新表

CREATE TABLE new_employees
(
id_num int IDENTITY(0,1), --从0开始每次都增加1
fname varchar (20),
minit char(1),
lname varchar(30)
)

 

3 IDENTITY(函数)(Transact-SQL)

只用于在带有 INTO table 子句的 SELECT 语句中将标识列插入到新表中。

尽管类似,但是 IDENTITY函数不是与 CREATE TABLE 和 ALTER TABLE 一起使用的 IDENTITY 属性。

因为该函数在表中创建一个列,所以必须用下列方式中的一种在选择列表中指定该列的名称:

--(1) SELECT IDENTITY(int, 1,1) AS ID_Num INTO NewTable FROM OldTable --(2) SELECT ID_Num =IDENTITY(int, 1, 1) --int类型从1开始每次增加1个 INTO NewTable FROM OldTable
--方法1和方法2达到的效果是一样的

 

4 数据库表中字段为主键并自增

1、把主键定义为自动增长标识符类型(主要是SQL Server)

create table a1(id int identity(1,1) primary key not null, name varchar(15));

insert into a1(name) values('111'),('22');

select id from a1;

 

2、在MySQL 中,如果把表的主键设为auto_increment类型,数据库就会自动为主键赋值。例如:

create table customers(id int auto_increment primary key not null, name varchar(15));

insert into customers(name) values("name1"),("name2");

select id from customers;

以上sql语句先创建了customers表,然后插入两条记录,在插入时仅仅设定了name字段的值。最后查询表中id字段,查询结果为:

id

1

2

由此可见,一旦把id设为auto_increment类型,mysql数据库会自动按递增的方式为主键赋值。

 

3 从序列中获取自动增长的标识符(主要是Oracle)

在Oracle中,可以为每张表的主键创建一个单独的序列,然后从这个序列中获取自动增加的标识符,把它赋值给主键。例如一下语句创建了一个名为customer_id_seq的序列,这个序列的起始值为1,增量为2。

 

create sequence customer_id_seq increment by 2 start with 1

 

一旦定义了customer_id_seq序列,就可以访问序列的curval和nextval属性。

curval:返回序列的当前值

nextval:先增加序列的值,然后返回序列值

 

以下sql语句先创建了customers表,然后插入两条记录,在插入时设定了id和name字段的值,其中id字段的值来自于customer_id_seq序列。最后查询customers表中的id字段。

 

create table customers(id int primary key not null, name varchar(15));

insert into customers values(customer_id_seq.curval, "name1"),(customer_id_seq.nextval, "name2");

select id from customers;

 

如果在oracle中执行以上语句,查询结果为:

id

1

3

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用数据库函数获取主键,具体方法取决于使用的数据库类型。一些常见的数据库函数如下: 1. MySQL:LAST_INSERT_ID()函数可以用来获取上一次插入操作中自动生成的主键值。 2. Oracle:在插入操作后,可以通过SELECT语句加上CURRVAL关键字和序列名称来获取最新的序列值。 3. SQL Server:SCOPE_IDENTITY()函数可以返回当前会话中最后插入的行的标识符。 4. PostgreSQL:使用RETURNING关键字来获取最近一次插入操作的主键值。 注意,在使用这些函数时,必须保证在同一个会话中进行插入操作和获取主键值的操作,否则可能会返回错误的结果。 ### 回答2: 在使用数据库函数获取主键时,可以通过以下几种方式来实现。 1. 使用自增主键:在创建数据库表时,可以为主键字段设置自增属性。这样,在每次插入新记录时,数据库会自动为主键字段生成一个唯一的值。通过获取最后插入的主键值,可以得到最新插入记录的主键。 2. 使用数据库函数:不同数据库系统提供了不同的函数来获取最后插入的主键值。例如,MySQL提供了LAST_INSERT_ID()函数,可以用来获取最后插入的自增主键值。Oracle数据库中,可以使用CURRVAL和NEXTVAL等函数来获取序列的当前值和下一个值。 3. 使用特定语句获取主键:有些数据库系统提供了特定的语句来获取主键值。例如,SQL Server中可以使用SCOPE_IDENTITY()函数来获取最后插入的自增主键值。PostgreSQL中,可以使用RETURNING子句来返回插入记录的主键。 无论使用哪种方式,获取主键的步骤大致如下: 1. 执行插入操作,向数据库表中插入一条新记录。 2. 使用相应的数据库函数或语句,获取最后插入的主键值。 3. 对获取到的主键值进行处理,如存储到变量中或进行其他操作。 需要注意的是,不同的数据库系统可能使用不同的方法来获取主键值。在使用时,要根据具体的数据库系统和相关文档来选择适合的方式。 ### 回答3: 使用数据库函数获取主键可以通过使用数据库系统提供的特定函数来实现。以下是使用SQL语句获取数据库主键的一种常见方法: 1. 首先,使用SHOW TABLES语句获取数据库中的所有表名。例如,使用以下SQL语句查询数据库的所有表名: SHOW TABLES; 2. 使用DESCRIBE语句获取指定表的列信息。例如,使用以下SQL语句查询表名为"tablename"的所有列信息: DESCRIBE tablename; 3. 在返回的列信息中,查找PRIMARY KEY字段,该字段存储了主键信息。 例如,返回的列信息可能如下所示: Field Type Null Key Extra ------------------------------------------------------------- id INT(11) NO PRI auto_increment name VARCHAR(50) YES 在上述例子中,id列被标记为主键(PRI)。 综上所述,通过使用SHOW TABLES和DESCRIBE语句,我们可以获取数据库中特定表的主键信息。根据数据库的具体类型和版本,可能会有一些差异。因此,在实际应用中应该根据具体的数据库类型和语法规则来编写相应的SQL语句。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值