mysql-约束

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql-约束相关的知识,希望对你有一定的参考价值。

4、约束:

1)、对一个列添加的约束叫列级约束。对两个或两个以上的列添加的约束叫做表级约束。

2)、表级约束只能在字段后面添加,列级约束既可以添加在字段后面,也可以在最后添加。

3)、非空、默认只存在列级约束。主键、唯一、外键都既有表级约束又有列级约束。

4)、约束有:primary key (主键)、unique (唯一)、not null (非空) 、default (默认)、foreign key (外键)。5)、unsigned (无符号整数,从 0int 的最大值)6)、auto_increment (自增长,必须与主键同时使用)

1、主键:(primary key)

添加:一般添加主键的时候都会再添加 auto_increment 
     alter table tb_name add primary key(field_name);
删除:删除主键之前必须先删除 auto_increment
     alter table tb_name drop primary key;


2、外键:(foreign key)

外键的使用条件:
    ① 两个表必须是 Engine=InnoDB 表,MyISAM表暂时不支持外键
       InnoDB 是mysql的数据库引擎之一,其支持事务的4大特性并兼容事务。
       ISAM(索引顺序存取方法:indexed sequential access method)也是一种数据库引擎在其中数据组织成固定长度的记录,并按顺序存储。
       MYISAM 每个MYISAM在磁盘上存储成三个文件,每个文件都是以表明开头,扩张名支出文件的类型:
            .frm:存储表定义
            .MYD(MYData)存储表的数据
            .MYI(MYIndex)存储表的索引
    ② 外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显式建立;
    ③ 外键关系的两个表的列必须是数据类型相似,也就是可以相互转换类型的列,比如int和tinyint可以,而int和char则不可以;

外键的好处:
    ① 可以使得两张表关联,保证数据的一致性和实现一些级联操作。

外键就是:引用字段的值必须在被引用字段中存在,除非引用字段是NULL

被引用字段必须有唯一约束或主键约束。

添加:添加外键之前一定要保证引用字段和被引用字段的类型一致,以及数据库引擎一致(既:都为 InnoDB )
     alter table tb1_name add constraint fk_name foreign key (field1_name) references tb2_name (field2_name);
建表时添加外键:
     foreign key (field1_name) references tb2_name (field2_name);
删除:alter table tb_name drop foreign key fk_name;

外键的完整定义:
      alter table tb1_name add constraint fk_name
      foreign key (field_name)
      references tb2_name (field_name)
      match [simple/full]    外键匹配模式:引用字段全不为空,则强匹配,否则,若匹配。
      on delete [cascade/no action]为cascade时,删除被引用表中数据时,引用表中的数据也会删除。为no action时,删除被引用表中的数据之前要先删除引用表中的数据,否则会返回错误。
      on update [cascade/no action]更新时时一样的。同上。
      对于on deleteon update 来说,默认的都是 no action 。
      当添加外键失败时,有两种情况:
              ① 数据类型不一致
              ② 数据库引擎不对,检查是不是InnoDB
              
自动键更新和删除:
外键可以保证新插入的记录的完整性,但是,如果在REFERENCES从句中已命名的表删除记录会怎么样?在使用同样的值作为外键的辅助表中会发生什么?
  
 很明显,那些记录也应该被删除,否则在数据库中就会有很多无意义的孤立记录,MYSQL可以通过向FOREIGN KEY...REFERENCES修饰符添加一个ON DELETE 或ON UPDATE子句简化任务,它告诉了数据库在这种情况如何处理孤立任务
 
 关键字     含义
 CASCADE    删除包含与已删除键值有参照关系的所有记录
 SET NULL   修改包含与已删除键值有参照关系的所有记录,使用NULL值替换(只能用于已标记为NOT NULL的字段)
 RESTRICT   拒绝删除要求,直到使用删除键值的辅助表被手工删除,并且没有参照时(这是默认设置,也是最安全的设置)
 NO ACTION  啥也不做
 
 请注意,通过ON UPDATEON DELETE规则,设置MYSQL能够实现自动操作时,如果键的关系没有设置好,可能会导致严重的数据破坏,
 例如:如果一系列的表通过外键关系和ON DELETE CASCADE 规则连接时,任意一个主表的变化都会导致甚至只和原始删除有一些将要联系的记录在没有警告的情况被删除,所以,我们在操作之前还要检查这些规则的,操作之后还要再次检查.
 
 
 所有tables必须是InnoDB型 ,它们不能是临时表。
 ·         在引用表中,必须有一个索引,外键列以同样的顺序被列在其中作为第一列。这样一个索引如果不存在,它必须在引用表里被自动创建。
 ·         在引用表中,必须有一个索引,被引用的列以同样的顺序被列在其中作为第一列。
 ·         不支持对外键列的索引前缀。这样的后果之一是BLOB和TEXT列不被包括在一个外键中, 这是因为对这些列的索引必须总是包含一个前缀长度。
 ·         如果CONSTRAINTsymbol 被给出,它在数据库里必须是唯一的。如果它没有被给出,InnoDB自动创建这个名字。
 
 
3、唯一约束(unique)
添加:
     alter table tb_name add unique (field1_name,field2_name, ... );
删除:
     alter table tb_student drop index/key name;
     
       
4、自增长约束(auto_increment)
auto_increment 的添加和删除都是使用 change 来进行的。其实质是:新建一个同名字段来代替原有字段,但是在这个过程中primary key是不会改变的。
如元字段为:id int(10) unsigned primary key auto_increment
删除:
    alter table tb_name change id id int(10) unsigned;       (其结果为:id int(10) unsigned primary key)
添加:
    alter table tb_name change id id int(10) unsigned auto_increment;       (其结果为:id int(10) unsigned primary key auto_increment)


5、change 
列级约束都可以通过change 来实现修改。

default 、unsigned 、not null

 




以上是关于mysql-约束的主要内容,如果未能解决你的问题,请参考以下文章

mysql 错误代码1217 MYSQL外键约束检查失败,删除或修改主表记录失败 怎么解决啊

部分代码片段

linux中怎么查看mysql数据库版本

NestedScrollView、LinearLayout 超出约束过度滚动

从mysql的片段中加载ListView

连接MySQL出现错误:ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)(代码片段