数据完整性约束的主键约束和替代键约束

1.主键约束

1.定义主键

  主键就是表中的一列或多个列的一组,其值能唯一地标识表中的每一行。MySQL为主键列创建了唯一性索引,实现了数据的唯一性,在查询中使用主键时,该索引可用来对数据进行快速访问。MySQL通过定义PRIMARY KEY约束来创建主键,而且PRIMARYKEY约束中的列不能取空值。如果 PRIMARY KEY约束是由多列组合定义的,则某一列的值可以重复,但PRIMARY KEY约束定义中所有列的组合值必须唯一。
  用户可以用两种方式定义主键,作为列或表的完整性约束,作为列的完整性约束时,只需在列定义的时候加上关键字PRIMARY KEY;作为表的完整性约束时,需要在语句最后加上一条 PRIMARY KEY(列名,.)语句。
  创建表book_copy,将“书名”定义为主键。

CREATE TABLE book_copy

(
      图书编号 varchar(6) NULL,

      书名 varchar(20) NOT NULL PRIMARY KEY ,

      出版日期 date
);


  上面的表中主键定义于 NOT NULL之后,也可以在主键之后指定NOT NULL。如果作为主键的一部分的一个列没有定义为NOT NULL,MySQL就自动把这个列定义为NOT NULL。上面的表中的书名列可以没有NOT NULL声明,为了 楚起见,最好包含这个空指定。
当表中的主键为复合主键时,只能将其定义为表的完整性约束。


   创建course表来记录每门课程的学生的“学号”“姓名”“课程号”“学分“毕业日期”。其中“学号”“课程号”“毕业日期”构成复合主键。

CREATE TABLE course

(
      学号   varchar(6) NOT NULL,

      姓名   varchar(8) NOT NULL,

      毕业日期   date NOT NULL,
      
      课程号   varchar(3),

      学分   tinyint,

      PRIMARY KEY   (学号,课程号,毕业日期)
);
2.定义主键的原则

  原则上,任何列或者列的组合都可以充当一个主键,但是主键列必须遵守一些规则。这些规则源于关系模型理论和MySQL所制定的规则。
  (1)每个表必须定义一个主键
  关系模型理论要求必须为每个表定义一个主键。然而,MySQL并不要求这样,它可以创建一个没有主键的表。但是,从安全角度考虑,应该为每个基础表指定一个主键。主要原因在于,没有主键,可能在一个表中存储两个相同的行,当两个行不能彼此区分时,查询过程中将会满足同样的条件,更新的时候也总是一起更新,这样容易造成数据库崩溃。
  (2)唯一性规则
  表中两个不同的行在主键上不能具有相同的值。(3)最小化规则
如果从一个复合主键中删除一列,而剩下的列构成的主键仍然满足唯一性原则,那么这个复合主键是不正确的。这条规则称为最小化规则,也就是说,复合主键不应该包含一个不必要的列。一个列名在一个主键的列表中只能出现一次。
  MySQL自动地为主键创建一个索引,通常这个索引名为PRIMARY,用户可以重新给这个索引起名。
  参照上列表中的course 表创建coursel表,将索引命名为“INDEX_course”。

CREATE TABLE coursel
(
   学号	varchar(6) NOT NULL,	

   姓名	varchar(8) NOT NULL,	

   毕业日期	datetimeNOT NULL,

   课程号	varchar (3),	

   学分	tinyint,

   PRIMARY KEY INDEX_course(学号,课程号,毕业日期)
);

2.替代键约束

  替代键像主键一样,是表的一列或一组列,它们的值在任何时候都是唯一的。因为一个表只能有一个主键,所以当一个表有多个列需要建立唯一性约束时,替代键是没有被选做主键的候选键。定义替代键的关键字是 UNIQUE。

  在表 bookcopy1中,将“图书编号”作为主键,将“书名”列定义为一个替代键。

CREATE TABLE book_copy1
(

  图书编号 varchar(20)NOT NULL,
  
  书名varcha(20)NOT NULL UNIQUE,
  
  出版目期 date NULL,
  
  PRIMARY KEY(图书编号)
);

  关键字 UNIQUE 表示“书名”是一个替代键,其列值必须是唯一的。):替代键也可以定义为表的完整性约束,上述语句也可以进行如下定义。

CREATE TABLE book copy1
(
 
  图书编号varchar(20)NULL,
   
  varchar(20)NOT NULL书名

  出版日期 date NULL,
  
  PRIMARY KEY(图书编号),

  UNIQUE(书名)
);

  在 MySQL中,替代键和主键的区别主要有以下几点。
  (1)数量不同
  一个数据表只能创建一个主键,但可以有若干个 UNIQUE键,并且它们甚至可以重合例如,在C1和C2列定义了一个替代键,并且在C2和C3列定义了另一个替代键,这两个替代键在C2列上重合,MySQL允许这样。
  (2)NULL 设置不同
  主键字段的值不允许为 NULL,而 UNIQUE 字段的值可取 NULL,但是必须使用 NULL或 NOT NULL 声明。
  (3)索引不同
  创建 PRIMARY KEY约束时,系统自动产生PRIMARY KEY索引。创建 UNIQUE 约束时,系统自动产生 UNIQUE索引。
  对于已经创建好的表,可以使用ALTERTABLE语句向表中添加约束。语法格式如下

ALTER TABLE 表名
ADDPRIMARYKEY【列方式](列名)  /*添加主键*/
IADD UNIQUE[系引名](列名,)   /*添加替代键约束*/
|DROP PRIMARY KEY            /*删除主键*/
IDROP INDEX引名              /*删除索引*/

  假设 book 表中主键未设定,为 book 表建立主键约束为“图书编号”,“书名”为詞佷替代键约束。

ALTER TABLE Book

ADD PRIMARY KEY(图书编号),

    ADD UNIQUE uidx(书名);

  本例中既包括主键约束,也包括替代键约束,说明MySQL可以同时创建多个约束注意,使用PRIMARYKEY的列必须是一个具有NOTNULL属性的列。

  删除 book 表中的主键和替代键约束。

ALTER TABLE Book
   DROP PRIMARY KEY,
   DROP INDEXuidx;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值