【网学网提醒】:网学会员为您提供sql_constraint参考,解决您在sql_constraint学习中工作中的难题,参考学习。
约束种类
每一种约束的作用的了解演示。
非空约束
唯一性约束
检查约束
主键约束--每个表要有主键,唯一的标识一行数据,主键的特点非空并且唯一
外键约束外键引用的列一定是主键或有unique约束的列
脚本(SCRIPT)
列级约束并且非空约束(非空约束的特点是不能为null)
createtablecla(--班级表
idintprimarykey,--班级编号
cnamevarchar(20)notnull--班级名字
);
altertableclaaddageintdefault20;
唯一性约束
createtableclauni(
idint,
namevarchar(20)unique,
ageint
);
insertintoclauni(id,name,age)values(1,'zhang',20);
insertintoclauni(id,name,age)values(1,null,20);
insertintoclauni(id,name,age)values(1,'zhangs',20),(2,'lisi',20);
表级约束的定义
形式一:
createtableclaunit(
idintunique,
namevarchar(20),
ageintdefault0,
constraintclaunit_name_uniquekunique(name)
);
insertintoclaunit(id,name,age)values(1,'zhang',30),(2,'zhang',30);
形式二:
createtableclaunit1(
idintunique,
namevarchar(20),
ageintdefault0,
unique(name)
);
形式三:
createtableclaunit2(
idintunique,
namevarchar(20)unique,
ageintdefault0
);
altertableclaunit2addconstraintcla_age_ukunique(age);
约束字符
创建带主键的,自动增长的id列
createtabledepttest(
idintprimarykeyauto_increment,
namevarchar(255)
);
createtablejfw(
idintnotnullunique,//列级约束
namevarchar(20),
constraintjfw_name_uniqunique(name)//表级约束
);
altertablejfwwaddjobvarchar(20);
altertablejfwwaddconstraintjfww_job_unikunique(job);//插入约束的另一种方式
createtablestudent(
firstnamevarchar(20),
lastnamevarchar(20),
constraintstudent_f_l_prikprimarykey(firstname,lastname)
);//创建联合主键
主键
联合主键表级定义
createtablestudent(
firstnamevarchar(20),
lastnamevarchar(20),
addressvarchar(20),
constraintstudent_prikeyprimarykey(firstname,lastname)
);
insertintostudent(firstname,lastname,address)values('zh','wei','nj'),('zh','wei','bj');
列级定义
createtablestudent1(
idintprimarykey,
namevarchar(20)
);
insertintostuden
t1(id)values(1),(1);
check表达式
createtablestudent2(
idintprimarykey,
namevarchar(20),
ageintcheck(age>18)
)
创建外键:
createtablestu(
cidint,
namevarchar(20),
ageint
)ENGINE=InnoDB;//子表必须为InnoDB型存储引擎
createtableclass(
cidint,
banjicarchar(20),
managervarchar(20)
)ENGINE=InnoDB;//主表必须为InnoDB型存储引擎
altertableclassmodifyidintprimarykey;//主表外键列名必须为主键。
insertintoclassvalues(2,'test','chenzhen');
insertintoclassvalues(1,'java','zhangbin');
altertablestuaddconstraintstu_cid_forkforeignkey(cid)referencesclass(cid);//创建外键
/*altertableclassENGINE=InnoDB;//修改存储引擎,创建外键后,主子表必须为InnoDB型存储引擎*/
showcreatetablestu\g;//显示表的详细信息:
altertableempzwaddconstraintempzw_deptno_fkforeignkey(deptno)referencesdept(deptno);
//创建外键
删除外键
altertableempzwdropforeignkeyempzw_deptno_fk;
创建新的外键
altertableempzwaddconstraintempzw_deptno2_fkforeignkey(deptno)referencesdeptzw(deptno)
ondeletecascade
onupdatecascade;
altertableempzwdropforeignkeyempzw_deptno1_fk;
altertableempzwaddconstraintempzw_deptno3_fkforeignkey(deptno)referencesdept(deptno)
ondeletecascade;
altertableemptestaddconstraintempzw_dept_fkforeignkey(deptno)referencesdeptzw(deptno)
ondeletecascade;
altertableempxhaddconstraintempxh_deptno_fk1foreignkey(deptno)referencesdeptxh(deptno)ondeletecascade;
如何删除约束
altertablestudentdropconstraintfk_stu;//没能成功!!
可以用一个统一的格式来删除
altertable表名dropconstraint约束名
主键=非空+唯一
非空
唯一=有值的话值要不同
外键=有值一定要在被引用的表的数据中
复习:sql语言包括的几部分:
《1》DDL语句(数据定义语言)DataDefineLanguage
create
alter
drop
truncate
truncatetable<表名>
特点:<1>建立和修改数据对象
<2>建立和修改直接存入库中,直接生效
建立表
createtableclass(--班级表
classidnumber(2)primarykey,
cnamevarchar2(20)notnull);
altertablestudentadd(shengfenzhengnumber(18));
droptablestudent;删除结构
deletefromstudent;只删除数据,速度慢,数据可以恢复
truncatetablestudent;删除记录的速度快数据不能恢复
《2》DML语句(数据操作语言)DataManupilateLanguage
select
insert
delete
update
《3》TCL(事务控制语句)TransactionControlLanguage
《4》DCL语句(数据控制语句)DataControlLanguage
select*fromclass,stu;
select*fromclass,stuwherestu.id=class.id;
selectc.id,c.banji,c.banzhu,s.namefromclassc,stuswheres.id=c.id;//c,s是别名,多表查询。
selectc.id,c.banji,c.banzhu,s.namefromclasscinnerjoinstusons.id=c.id;//内连接,作用同上。
selectc.id,c.banji,c.banzhu,s.namefromclasscleftouterjoinstusons.id=c.id;//左外连接,将连接的左边的表格中所有数据取出与右边匹配。
selectc.id,c.banji,c.banzhu,s.namefromclasscrightouterjoinstusons.id=c.id;//与上相反。
selecte.empno,e.ename,e.mgr,em.empno,em.enamefromempe,empemwhereem.empno=e.mgr;//自连接。很强大!!
select*fromempwheresal>(selectavg(sal)fromemp);//子查询
selectd.enameasselfname,(selectc.enamefromempcwherec.empno=d.mgr)asmanegerfromempd;//子查询!!