SQL主键和约束

SQL主键和约束

 

主键

1.工具创建表  列  数据类型  是否null 

     一个表中,会存很多条记录,需要一个列来唯一标识一条数据。

     主键:唯一标识一条数据。值 不能重复   不能为空

     什么样的列可以设置为主键:值 不能重复   不能为空

     什么叫标识列?一个列设置成标识列,它就不能再手动插入,插入时,自动生成的。

             这个列,类型必须是不带小数的数值型  整型

        标识列:标识种子 第一条记录标识列的值 100   增量  3

                    删除了数据,再插入,就会出现不连续   缺点

 

主键的特点【重点】

含有主键的表叫做主键表

主键通常都是整数不建议使用字符串当主键(如果主键是用于集群式服务,才可以考虑用字符串当主键)

主键的值通常都不允许修改,除非本记录被删除

主键不要定义成id,而要定义成表名Id或者表名_id

                    要用代理主键,不要用业务主键

                    任何一张表,强烈建议不要使用有业务含义的字段充当主键

                    我们通常都是在表中单独添加一个整型的编号充当主键字段

主键是否连续增长不是十分重要

 

2.创建主键   联合主键 唯一标识

创建一个主键,同时自动创建了一个聚集索引

3.创建外键

     外键:一般在两个表之间要建立关联时候,创建

           一个列创建为外键,它在另一个表必须是主键

     外键:DeptId  UserInfos 外键表

         

          DeptInfos 主键表

    两个表一旦建立外键关系,外键表里的对应的外键列,它的值必须是它对应的主键表里的主键值,不如果你想插入一个不存在 的值,你是插入不进去的。

    一个表里可以有多个外键,也可以没有,一个表只能有一个主键,也可以没主键,但一般都会设置一个主键。

 

问题:先删主键表还是外键表?

答:先删外键表。如果先删主键表,会报错,因为这会导致外键表中的数据引用失败。

 

约束

  1. 约束定义:规定表中的数据规则。如果存在违反约束的数据行为,行为就会被阻止。

     

  在什么时候可以创建约束呢?使用软件创建,创建表之后,  使用脚本创建表:可以在创建的过程中,也可以在创建后再来建立约束。

2. 分类

主键  Primary Key约束:唯一性、非空,不能修改。

  • defaut:为默认值约束的关键字,用于指定其后的default_expression 为默认值表达式  。                                                                        

  • identity:[(seed,increment)] 表示该列为标识列或称自动编号列。

  • constraint       constraint_name 为可选项,关键字constraint用于指定其后面的约束名称constraint_name。如省略本选项,则系统自动会给出一个约束名。建议选择约束名以便于识别。

  • primary key:表示该列具有主键约束。

  • clustered | nonclustered 表示建立聚簇索引和非聚簇索引,省略此选项默认为聚簇选项。

 

     外键  Foreign Key约束:加强两个表的一列或多列数据之间的连接的。先建立主表的主键,然后再定义从表中的外键。只有主表中的主键才能被从表用来作为外键使用。主表限制了从表更新和插入的操作。当删除主表中的某条数据,应该是先删除从表中相关的数据,再删除主表。

   创建外键约束格式:

    Unique约束 唯一性约束:确保表中的一列数据没有相同的值。与主键约束相似,但又不同。主键只能有一个,但一个表中可以定义多个唯一约束。唯一键可以为NULL,但主键不可以。

    Check约束:通过逻辑表达式来判断数据的有效性,用来限制输入一列或多列的值的范围。

    Default约束:默认值约束。用户在插入新的数据行时,如果该行没有指定数据,那么系统将默认值赋给该列,如果没有设置默认值,系统就会默认为NULL。

    Not Null : 非空性约束 

3、表和约束的异同

  •  数据库是通过表来解决事物的存储问题的

  •  数据库是通过约束来解决事物取值的有效性和合法性的问题

  •  建表的过程就是指定事物属性及其事物属性各种约束的过程

 

4、primary key 约束与unique 约束的主要区别:

  • 一个数据表只能创建一个primary key 约束,但一个表中可根据需要对不同的列创建若干个unique 约束。

  • primary key 字段的值不允许为NULL,而unique字段的值可取NULL.

  • 一般创建primary key约束时,系统会自动产生索引,索引的默认类型为聚簇索引。创建unique 约束时,系统会自动产生一个unique索引,索引的默认类型为非聚簇索引。

     

相同点:

  • 二者均不允许表中对应字段存在重复值。

  • 二者均自动创建一个唯一索引

 

语法格式

1.在创建表的过程中创建约束

   unique    主键约束   外键约束   unique约束(唯一约束)  check约束   default约束 default('')    primary key   foreign key references 主表名(主键列名)

 

2.在创建表完成后再创建约束

  alter table 表名 add constraint 约束名      primary key (列名) /      foreign key(列名) references 主表(列名)/      unique (列名)/      check(逻辑表达式)      default(缺省值) for 列名

     

3、设置主键约束

 语法:

CONSTRAINT  constraint_name  PRIMARY  KEY  ( column_name )

 

例子:

create table mysc(sno char(4) not null, cno char(10) not null, grade tinyint)alter table myscadd constraint mysc_pkprimary key (sno,cno)alter table myscdrop constraint mysc_pk

 

4. 设置唯一性约束

  语法:

CONSTRAINT  constraint_name UNIQUE ( column_name )

           

例子:

create table 雇员表(雇员号 char(10) primary key, 雇员名 nvarchar(8) unique )alter table studentadd constraint uk_sname_sunique (sname)select * from studentwith (index=uk_sname_s)alter table studentdrop constraint uk_sname_s

 

5. 外键约束

语法:

CONSTRAINT  constraint_name  FOREIGN  KEY(column_name[,…n])REFERENCES    ref_table  [(ref_column[,…n])]

 

例子:

create table xs(sno char(10) primary key)create table xs_kc(sno char(10), cno char(4), grade tinyint, foreign key (sno) references xs(sno)        on update cascade        on delete cascade)create table kc(cno char(4) primary key, cname nvarchar(20), cpno char(4), credit tinyint)alter table xs_kc        add constraint kc_foreign                foreign key (cno) references kc(cno)alter table xs_kcdrop constraint  kc_foreign

 

6. Check 约束:

例子:

alter table xsadd ssex char(2)        constraint sex_ck                check(ssex in ('男','女'))alter table xs_kcdrop constraint sex_ckalter table xs_kcadd constraint grade_ck        check(grade>=0 and grade<=750)alter table xs_kcdrop constraint grade_ck

 

7. 默认约束default

格式:

CONSTRAINT constraint_name DEFAULT  constraint_expression  [FOR column_name]

 

例子:

create table mystudent2(sno char(10), sname nvarchar(4), ssex char(2), sdept nvarchar(10)        constraint sdept_defa        default ('计算机科学'), scomegrade smallint         constraint cg_ck         check (scomegrade>=0 and scomegrade<=750) ) create table stu(sno char(10), sname varchar(8), ssex char(2)        constraint sex_ck                check (ssex in ('男','女')), sdept varchar(20)        constraint sdept_defa1                default ('计算机科学')

 

 

use TestBasego--创建表create table ProductInfos(   Id int identity(1001,1) primary key  not null,  --标识种子,增量   ProNo varchar(50) unique not null,   ProName nvarchar(20) not null,   TypeId int not null foreign key references ProductType(TypeId) ,   Price decimal(18,2) check(Price<10000) default (0.00) not null,   ProCount int default (0) null,)go--删除表drop table ProductInfosgo--在建表完成后,创建约束 create table ProductInfos(   Id int identity(1001,1)  not null,  --标识种子,增量   ProNo varchar(50)  not null,   ProName nvarchar(20) not null,   TypeId int not null ,   Price decimal(18,2)  not null,   ProCount int  null)go--主键  Idalter table ProductInfos add constraint PK_ProductInfos primary key(Id)--外键  TypeIdalter table ProductInfos add constraint FK_ProductInfos foreign key (TypeId) references ProductType(TypeId)--unique约束  ProNo

 

 

 

收录于合集 #sql
 5
下一篇SQL Server 数据操作
阅读 107
Linux分布式主任
58篇原创内容
 
posted @ 2023-07-03 10:09  往事已成昨天  阅读(54)  评论(0编辑  收藏  举报