完整性约束

完整性约束

概览

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

  约束条件与数据类型的宽度一样,都是可选参数,主要分为以下几种:

# NOT NULL :非空约束,指定某列不能为空; 
# UNIQUE : 唯一约束,指定某列或者几列组合不能重复
# PRIMARY KEY :主键,指定该列的值可以唯一地标识该列记录
# FOREIGN KEY :外键,指定该行记录从属于主表中的一条记录,主要用于参照完整性
设置严格模式:
    不支持对not null字段插入null值
    不支持对自增长字段插入”值
    不支持text字段有默认值

直接在mysql中生效(重启失效):
mysql>set sql_mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION";

配置文件添加(永久失效):
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

约束某一个字段
无符号的 int unsigned
不能为空 not null
默认值 default
唯一约束 unique
联合唯一 unique(字段1,字段2)
自增 auto_increment
只能对数字有效.自带非空约束
至少是unique的约束之后才能使用auto_increment
主键 primary key
一张表只能有一个
如果不指定主键,默认是第一个非空+唯一
联合主键 primary key(字段1,字段2)
外键 Foreign key
Foreign key(自己的字段) references 外表(外表字段)
外表字段必须至少是"唯一"的

on update cascade #级联更新
on delete cascade # 级联删除 尽量不用

不能重复  unique   值不能重复,但是null可以写入多个
create table t13(
  id1 int unique,
  id2 int
)

联合唯一 unique
create table t14(
    id int,
    server_name char(12),
    ip char(15),
    port char(5),
    unique(ip,port)
);

非空 + 唯一约束
第一个被定义为非空+唯一的那一列会成为这张表的primary key
一张表只能定义一个主键
create table t15(
    id int not null unique,
    username char(18) not null unique
);
create table t16(
    username char(18) not null unique,
    id int not null unique
);
create table t17(
    username char(18) not null unique,
    id int primary key
);

联合主键
create table t18(
    id int,
    server_name char(12),
    ip char(15) default '',
    port char(5) default '',
    primary key(ip,port)
);

create table t19(
    id int primary key,
    server_name char(12),
    ip char(15) not null,
    port char(5) not null,
    unique(ip,port)
);

自增
create table t20(
    id int primary key auto_increment,
    name char(12)
);
insert into t20(name) values('alex');

外键
班级表
create table class(
    cid int primary key auto_increment,
    cname char(12) not null,
    startd date
)# 学生表
# create table stu(
#     id int primary key auto_increment,
#     name char(12) not null,
#     gender enum('male','female') default 'male',
#     class_id int,
#     foreign key(class_id) references class(cid)
# )


create table stu2(
    id int primary key auto_increment,
    name char(12) not null,
    gender enum('male','female') default 'male',
    class_id int,
    foreign key(class_id) references class(cid) #设置外键 涉及class表的cid
    on update cascade  #级联更新
    on delete cascade  # 级联删除 尽量不用
)

原文地址:https://www.cnblogs.com/wyh0717/p/13390383.html