sql用命令创建主键与外键。

sql用命令创建主键与外键。,第1张

创建SQL的主键和外键约束的方法:

--在创建表时就可以对字段加上约束:

create table Student

(

StudentNo int PRIMARY KEY IDENTITY(1,1), --加主键约束,还有标识列属性(两者构成实体完整性)

StudentName nvarchar(15) not null, --加非空约束,不加"not null" 默认为:可以为空

StudentSchool text(20) FOREIGN KEY REFERENCES SchoolTable(SchoolName), --加外键约束,格式:FOREIGN KEY REFERENCES 关联的表名(字段名)

StudentAge int DEFAULT ((0)), --加默认值约束

StudentSex nvarchar(2) CHECK(StudentSex=N'男' or StudentSex=N'女') --加检查约束,格式:check (条件表达式)

)

--如果在表创建好了以后再加约束,则格式分别为:

-- 主键:

alter table 表名

add constraint PK_字段名--"PK"为主键的缩写,字段名为要在其上创建主键的字段名,'PK_字段名'就为约束名

primary key (字段名) --字段名同上

--唯一约束:

alter table 表名

add constraint UQ_字段名

unique (字段名)

--外键约束:

alter table 表名

add constraint FK_字段名--"FK"为外键的缩写

foreign key (字段名) references 关联的表名(关联的字段名) --注意'关联的表名'和'关联的字段名'

alter table 表A add constraint FK_B foreign key (ticket_no) references 表B(ticket_no)

alter table 表A add constraint FK_C foreign key (person_no) references 表C(person_no)

alter table 成绩表 add constraint FK_StudentNo foreign key (StudentNo) references Student (StudentNo)

ON UPDATE CASCADE ON DELETE CASCADE

级联更新,级联删除,这样在删除主表Student时,成绩表中该学生的所有成绩都会删除。

--检查约束:

alter table 表名

add constraint CK_字段名

check (条件表达式) --条件表达式中的条件用关系运算符连接

--默认值约束:

alter table 表名

add constraint DF_字段名

default '默认值' for 字段名--其中的'默认值'为你想要默认的值,注意'for'

--删除创建的约束:

alter table 表名

drop constraint 约束名--约束名为你前面创建的如:PK_字段这样的约束名

--注意:如果约束是在创建表的时候创建的,则不能用命令删除

--只能在'企业管理器'里面删除

参考资料 : >

1

首先删除主键,

然后重新创建主键,

重新创建主键的时候,

需要说明本主键是使用

非聚集索引

primary

key

nonclustered

(

sno

)

2

a:

pad_index

=

{

on

|

off

}

指定索引填充。默认值为

off。

on

fillfactor

指定的可用空间百分比应用于索引的中间级页。

off

或不指定

fillfactor

考虑到中间级页上的键集,将中间级页填充到接近其容量的程度,以留出足够的空间,使之至少能够容纳索引的最大的一行。

b:

fillfactor

=fillfactor

指定一个百分比,指示在创建或重新生成索引期间,数据库引擎对各索引页的叶级填充的程度。fillfactor

必须为介于

1

100

之间的整数值。默认值为

0。如果

fillfactor

100

0,则数据库引擎将创建完全填充叶级页的索引。

c:

ignore_dup_key

=

{

on

|

off

}

指定在插入 *** 作尝试向唯一索引插入重复键值时的错误响应。ignore_dup_key

选项仅适用于创建或重新生成索引后发生的插入 *** 作。当执行

create

index、alter

index

update

时,该选项无效。默认值为

off。

on

向唯一索引插入重复键值时将出现警告消息。只有违反唯一性约束的行才会失败。

off

向唯一索引插入重复键值时将出现错误消息。整个

insert

*** 作将被回滚。

d:

statistics_norecompute

=

{

on

|

off}

指定是否重新计算分发统计信息。默认值为

off。

on

不会自动重新计算过时的统计信息。

off

启用统计信息自动更新功能。

若要恢复统计信息自动更新,请将

statistics_norecompute

设置为

off,或执行

update

statistics

但不包含

norecompute

子句。

e:

on

[primary]

是指

索引创建在

primary

这个文件组上。

3、

以全国的身份z为例子:

对于

身份z号码,

有个

“唯一”

的索引

而对于

姓名,

有个

“不唯一”

的索引。

“不唯一”

的索引

虽然不能定位到唯一的某一行,

但是可以缩小范围。定位到某些行。

4

聚集索引

clustered

创建索引时,键值的逻辑顺序决定表中对应行的物理顺序。聚集索引的底层(或称叶级别)包含该表的实际数据行。一个表或视图只允许同时有一个聚集索引。

sqlserver的就不说了,楼上已经给出来了,有错误你稍加改动一下就可以,

给你个oracle的,相对sqlserver比较麻烦

--先建表

create table abc (id int,

name varchar2(10));

--建立一个sequence

create sequence seq_abc

minvalue 1

maxvalue 2000000000

start with 1

increment by 1

nocache

order;

--为abc表建立自增触发器

create or replace trigger trg_abc

before insert on abc for each row

begin

select seq_abcnextval into :newid from dual;

end;

--插入数据

insert into abc(name) values ('test1');

insert into abc(name) values ('test2');

--提交

commit;

主键(Primarykey):也称为主码或主关键字,用于惟一地确定一个元组的属性或属性组(复合主码)。每个关系都有一个并且只有一个主码。

外键(ForeignKey):也称为外码或外部关键字。如果一个属性集不是所在关系的关键字,但是是其他关系的关键字,则该属性集称为外部关键字。

在关系数据库中可以通过外键使两个关系关联,这种联系通常是一对多(1:n)的,其中主(父)关系(1方)称为被参照关系,从(子)关系(n方)称为参照关系。

扩展资料:

数据库主键作用:

1、保证实体的完整性

2、加快数据库的 *** 作速度

3、在表中添加新记录时,DBMS会自动检查新记录的主键值,不允许该值与其他记录的主键值重复。

4、DBMS自动按主键值的顺序显示表中的记录。如果没有定义主键,则按输入记录的顺序显示表中的记录。

在有些数据库中,虽然主键不是必需的,但最好为每个表都设置一个主键,不管是单主键还是复合主键。它存在代表着表结构的完整性,表的记录必须得有唯一区分的字段,主键主要是用于其他表的外键关联,以及本记录的修改与删除。

参考资料来源:百度百科-数据库主键

你们的想法是不是,想在建表时为id指定uuid,然后每次插入数据都会自动为每一条数据生成uuid呢?就像auto_increment主键自增一样呢?

我只想说 you are too young!

我一开始是这样做的:

create table product(

id varchar(36) primary key default uuid()

sql语句报错。

后来查了查资料,发现mysql好像并不支持在建表时,为某一字段指定默认函数值。但是在Oracle数据库中,却支持这样干,也就可以实现插入数据时,自动生成uuid。

所以在mysql中只能在插入数据时,将uuid()函数值赋值给id字段。

后来,我又想了一个方案,我可以去写一个触发器,每次在执行插入 *** 作时,都为id字段更新为uuid(),但是这种方式还是存在很多问题的,这里就不说了。

最后说明一点(uuid适不适合作为主键):

uuid号称“全球唯一”,实际上业务中一般不会只用一个uuid就保证某个字段的唯一性,因为它并不能保证唯一性,uuid的组成:

Mac地址+时间戳+自增序列,前两个都可以修改,自增序列在不同机器本身就无法保证唯一。既然无法保证唯一,那么没有任何处理的情况下直接将uuid作为主键,显然也是不合适的。

在创建表的时候可以设置,方法如下,用一下sql语句。

create table tableName(

id int identity(1,1) primary key,

data varchar(50))

解释:其中identity(1,1)代表自增,第一个1代表从1开始计数,第二个1代表每次增长1。

扩展资料:

SQL 全名是结构化查询语言[1](Structured Query Language),是用于数据库中的标准数据查询语言,IBM 公司最早使用在其开发的数据库系统中。1986年10月,美国国家标准学会(ANSI) 对 SQL 进行规范后,以此作为关系式数据库管理系统的标准语言 (ANSI X3 135-1986),1987年得到国际标准组织的支持下成为国际标准。不过各种通行的数据库系统在其实践过程中都对 SQL 规范作了某些编改和扩充。所以,实际上不同数据库系统之间的SQL不能完全相互通用。

参考资料:

百科-SQL语言

数据库主键

主键:表中经常有一个列或多列的组合,其值能唯一地标识表中的每一行。这样的一列或多列称为表的主键,通过它可强制表的实体完整性。当创建或更改表时可通过定义 PRIMARY KEY 约束来创建主键。一个表只能有一个 PRIMARY KEY 约束,而且 PRIMARY KEY 约束中的列不能接受空值。由于 PRIMARY KEY 约束确保唯一数据,所以经常用来定义标识列。

作用:

1)保证实体的完整性;

2)加快数据库的 *** 作速度

3) 在表中添加新记录时,ACCESS会自动检查新记录的主键值,不允许该值与其他记录的主键值重复。

4) ACCESS自动按主键值的顺序显示表中的记录。如果没有定义主键,则按输入记录的顺序显示表中的记录。

在有些数据库中,虽然主键不是必需的,但最好为每个表都设置一个主键,不管是单主键还是复合主键。它存在代表着表结构的完整性,表的记录必须得有唯一区分的字段,主键主要是用于其他表的外键关联,以及本记录的修改与删除。

主键的无意义性

在开发过程中,读者可能会看到将一些表使用有意义的字段表示主键,例如“用户登录信息表”将“登录名”(英文名)作为主键,“订单表”中将“订单编号”作为主键,如此设计主键一般都是没什么问题,因为将这些主键基本不具有“意义更改”的可能性。但是,也有一些例外的情况,例如“订单表”需要支持需求“订单可以作废,并重新生成订单,而且订单号要保持原订单号一致”,那将“订单编号”作为主键就满足不了要求了。因此读者在使用具有实际意义的字段作为主键时,需要考虑是否存在这种可能性。

主键的选择

①编号作主键

此方法就是采用实际业务中的唯一字段的“编号”作为主键设计,这在小型的项目中是推荐这样做的,因为这可以使项目比较简单化,但在使用中却可能带来一些麻烦,比如要进行“编号修改”时,可能要涉及到很多相关联的其他表,就像黎叔说的“后果很严重”;还有就是上面提到的“业务要求允许编号重复时”,我们再那么先知,都无法知道业务将会修改成什么

②自动编号主键

这种方法也是很多朋友在使用的,就是新建一个ID字段,自动增长,非常方便也满足主键的原则,优点是:数据库自动编号,速度快,而且是增量增长,聚集型主键按顺序存放,对于检索非常有利;数字型的,占用空间小,易排序,在程序中传递也方便;如果通过非系统增加记录(比如手动录入,或是用其他工具直接在表里插入新记录,或老系统数据导入)时,非常方便,不用担心主键重复问题。

缺点:其实缺点也就是来自其优点,就是因为自动增长,在手动要插入指定ID的记录时会显得麻烦,尤其是当系统与其他系统集成时,需要数据导入时,很难保证原系统的ID不发生主键冲突(前提是老系统也是数字型的);如果其他系统主键不是数字型那就麻烦更大了,会导致修改主键数据类型了,这也会导致其他相关表的修改,后果同样很严重;就算其他系统也是数字型的,在导入时,为了区分新老数据,可能想在老数据主键前统一加一个“o”(old)来表示这是老数据,那么自动增长的数字型又面临一个挑战。

以上就是关于sql用命令创建主键与外键。全部的内容,包括:sql用命令创建主键与外键。、如何创建数据库、Sqlserver 数据库自动编号主键怎么设计等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/10163870.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存