五种完整性约束分别是什么——基于MySQL数据库的数据约束实例

     为了防止不符合规范的数据进入数据库,在用户对数据进行插入、修改、删除等操作时,DBMS自动按照一定的约束条件对数据进行监测,使不符合规范的数据不能进入数据库,以确保数据库中存储的数据正确、有效、相容。

#数据约束

    1. #五种完整性约束:  
    2.   
    3. #NOT NULL :非空约束,指定某列不能为空;  
    4.   
    5. #UNIQUE : 唯一约束,指定某列或者几列组合不能重复  
    6.   
    7. #PRIMARY KEY :主键,指定该列的值可以唯一地标识该列记录  
    8.   
    9. #FOREIGN KEY :外键,指定该行记录从属于主表中的一条记录,主要用于参照完整性  
    10.   
    11. #CHECK :检查,指定一个布尔表达式,用于指定对应的值必须满足该表达式(mysql不支持check约束)  
    12.   
    13.    
    14.   
    15. #--------------------------------NOT NULL 非空约束 ---------------------------  
    16.   
    17. create table test4  
    18.   
    19. (  
    20.   
    21.     #建立非空约束  
    22.   
    23. id int not null,  
    24.   
    25. name varchar(55) default 'ABCD' not null,  
    26.   
    27. #默认值就是null  
    28.   
    29. age int null  
    30.   
    31. );  
    32.   
    33. #取消非空约束  
    34.   
    35.  alter table test4  
    36.   
    37.  modify name varchar(55) default 'ABCD' not null,  
    38.   
    39. #增加非空约束  
    40.   
    41.  alter table test4  
    42.   
    43.  modify age int not null;  
    44.   
    45. #--------------------------------UNIQUE : 唯一约束--------------------------------  
    46.   
    47. #列级约束语法建立约束  
    48.   
    49.  create table test_unique  
    50.   
    51.  (  
    52.   
    53.  #建立行级唯一约束  
    54.   
    55.  id int not null unique,  
    56.   
    57.  age int  
    58.   
    59.  );  
    60.   
    61.  #表级约束语法格式  
    62.   
    63.  create table unique_test3  
    64.   
    65.  (  
    66.   
    67. test6_id int not null,  
    68.   
    69. test6_name varchar(255),  
    70.   
    71. test6_pass varchar(255),  
    72.   
    73. #使用表级约束语法建立唯一约束,指定test6_id和test6_name两列组合不能重复  
    74.   
    75. constraint test6_unique unique(test6_id,test6_name),  
    76.   
    77. #使用表级约束语法建立唯一约束,约束名为test6_unique_2,test6_pass不能重复  
    78.   
    79. constraint test6_unique_2 unique(test6_pass)  
    80.   
    81.  );  
    82.   
    83.  #add关键字增加唯一约束  
    84.   
    85.  alter table test4  
    86.   
    87.  add unique(id,name,age);  
    88.   
    89.  #modify关键字删除或者增加唯一约束  
    90.   
    91.  alter table test4  
    92.   
    93.  modify age varchar(255) not null;  
    94.   
    95.  alter table test4  
    96.   
    97.  modify age varchar(255) not null unique;  
    98.   
    99.  #对大部分数据库而言,删除约束使用: alter table 表名 drop constraint 约束名  
    100.   
    101.  #但是Mysql不采取此方式,而是: alter table 表名 drop index 约束名  
    102.   
    103.  #--------------------------------PRIMARY KEY : 主键约束--------------------------------  
    104.   
    105.  #主键约束相当于非空约束和唯一约束。  
    106.   
    107.  #每个表只允许拥有一个主键,但是这个主键可以由多个数据列组成,这些列组合不能重复  
    108.   
    109.  #标准SQL允许给主键自行命名,但是对于Mysql来说自己的名字没有任何作用,总是默认名为PRIMARY  
    110.   
    111.  create table primary_test  
    112.   
    113.  (  
    114.   
    115. #使用列级语法建立主键约束  
    116.   
    117. test_id int primary key,  
    118.   
    119. test_name varchar(255)  
    120.   
    121.  );  
    122.   
    123.  #使用表级语法建立主键约束  
    124.   
    125.  create table primary_test2  
    126.   
    127.  (  
    128.   
    129. test_id int not null,  
    130.   
    131. test_name varchar(255),  
    132.   
    133. test_pass varchar(255),  
    134.   
    135. #指定主键约束名为test2_pk,对大部分数据库有效,但是对mysql无效,此主键约束名仍为PRIMARY  
    136.   
    137. constraint test2_pk primary key (test_id)  
    138.   
    139.  );  
    140.   
    141.  #以多列组合创立主键  
    142.   
    143.   create table primary_test3  
    144.   
    145.  (  
    146.   
    147. test_id int,  
    148.   
    149. test_name varchar(255),  
    150.   
    151. primary key(test_id,test_name)  
    152.   
    153.  );  
    154.   
    155.  #使用列级约束语法  
    156.   
    157.  alter table primary_test3  
    158.   
    159.  modify test_id int primary key();  
    160.   
    161.  #使用表级约束语法  
    162.   
    163.   alter table primary_test3  
    164.   
    165.   add primary key(test_id,test_name);  
    166.   
    167.  #删除主键约束:alter table 表名 drop primary key;  
    168.   
    169.  #主键列自增长特性:如果某个数据列的类型是整型,而且该列作为主键列,则可指定该列具有自增长功能  
    170.   
    171.  #mysql使用auto_increment来设置自增长,向该表插入记录时可不为该列指定值,由系统生成  
    172.   
    173.    create table primary_test3  
    174.   
    175.  (  
    176.   
    177. //建立主键约束、设置自增长  
    178.   
    179. test_id int auto_increment primary key,  
    180.   
    181. test_name varchar(255)  
    182.   
    183.  );  
    184.   
    185.  #外键约束 FOREIGN KEY  
    186.   
    187.  #Mysql中只有表级语法建立的外键约束才可以生效  
    188.   
    189.  #为保证参照主表的存在,先建立主表  
    190.   
    191.  create table teacher_tb  
    192.   
    193.  (  
    194.   
    195. t_id int auto_increment,  
    196.   
    197. t_name varchar(255),  
    198.   
    199. primary key(t_id)  
    200.   
    201.  );  
    202.   
    203.  create table student_tb  
    204.   
    205.  (  
    206.   
    207. s_id int auto_increment primary key,  
    208.   
    209. s_name varchar(255) not null,  
    210.   
    211. t_java int,  
    212.   
    213. foreign key(t_java) references teacher_tb(t_id)  
    214.   
    215.  );  
    216.   
    217. #如果使用表级约束语法,则需要使用foreign key指定本表的外键列,如果创建外键约束时没有指定约束名,  
    218.   
    219. #则mysql会为该外键约束命名为table_name_ibfk_n,其中table_name是从表的表名,n是从1开始的整数  
    220.   
    221.  create table teacher_tb2  
    222.   
    223.  (  
    224.   
    225. t_id int auto_increment,  
    226.   
    227. t_name varchar(255),  
    228.   
    229. primary key(t_id)  
    230.   
    231.  );  
    232.   
    233.  create table student_tb2  
    234.   
    235.  (  
    236.   
    237. s_id int auto_increment primary key,  
    238.   
    239. s_name varchar(255) not null,  
    240.   
    241. t_java int,  
    242.   
    243. constraint student_teacher_fk foreign key(t_java) references teacher_tb2(t_id)  
    244.   
    245.  );  
    246.   
    247.  #建立多列组合外键约束  
    248.   
    249.   create table teacher_tb5  
    250.   
    251.  (  
    252.   
    253. t_name varchar(255),  
    254.   
    255. t_pass varchar(255),  
    256.   
    257. primary key(t_name,t_pass)  
    258.   
    259.  );  
    260.   
    261.  create table student_tb5  
    262.   
    263.  (  
    264.   
    265. s_id int auto_increment primary key,  
    266.   
    267. s_name varchar(255) not null,  
    268.   
    269. t_java_pass varchar(255),  
    270.   
    271. t_java_name varchar(255),  
    272.   
    273. foreign key(t_java_name,t_java_pass)   
    274.   
    275.     references teacher_tb5(t_name,t_pass)  
    276.   
    277.  );  
    278.   
    279.  #删除外键约束  
    280.   
    281.  alter table student_tb2  
    282.   
    283.  drop foreign key student_teacher_fk;  
    284.   
    285.  #增加外键约束  
    286.   
    287.  alter table student_tb2  
    288.   
    289.  add foreign key(t_java) references teacher_tb2(t_id);  
    290.   
    291.  #外键约束参照自身,自约束  
    292.   
    293.  create table foreign_test9  
    294.   
    295.  (  
    296.   
    297. foreign_id int auto_increment primary key,  
    298.   
    299. foreign_name varchar(255),  
    300.   
    301. refer_id int,  
    302.   
    303. foreign key(refer_id) references foreign_test9(foreign_id)  
    304.   
    305.  );  
    306.   
    307.  #定义当删除主表记录时,从表记录也随之删除  
    308.   
    309.  #on delete cascade 把参照该主表记录的从表记录全部级联删除  
    310.   
    311.  #on delete set null 把参照该主表记录的从表记录从表设为null                e  
    312.   
    313.   create table teacher_tb8  
    314.   
    315.  (  
    316.   
    317. t_id int auto_increment,  
    318.   
    319. t_name varchar(255),  
    320.   
    321. primary key(t_id)  
    322.   
    323.  );  
    324.   
    325.  create table student_tb8  
    326.   
    327.  (  
    328.   
    329. s_id int auto_increment primary key,  
    330.   
    331. s_name varchar(255) not null,  
    332.   
    333. t_java int,  
    334.   
    335. constraint student_teacher_fk foreign key(t_java) references teacher_tb8(t_id) on delete cascade  
    336.   
    337.  ); 
posted @ 2017-04-22 21:27  一天从晚上开始  阅读(460)  评论(0编辑  收藏  举报