19、约束之间的比较:主键约束、联合约束、唯一约束、外键约束

约束之间的比较:主键约束、联合约束、唯一约束、外键约束

1、主键约束,primary_key

能唯一确定一张表中的记录,也就是我们通过给某个字段添加约束,就可以使得改字段不重复且不为空。

create table test1(
id int primary key,
name varchar(20) not null
);

1.2、联合约束,只要联合的主键值加起来不重复就可以了,且不为空

create table test2(
id int,
name varchar(20),
password varchar(20),
primary key(id,name)
);

mysql> desc test2;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id       | int(11)     | NO   | PRI | NULL    |       |
| name     | varchar(20) | NO   | PRI | NULL    |       |
| password | varchar(20) | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
3 rows in set

insert into test2 values(1,‘张三‘,‘000‘);
insert into test2 values(1,‘李四‘,‘000‘);
insert into test2 values(2,‘张三‘,‘000‘);
Query OK, 1 row affected

insert into test2 values (null,‘xiaoming‘,‘000‘);
1048 - Column ‘id‘ cannot be null

1.3 当创建表好了之后添加约束

create table test3(
id int,
name varchar(20)
);

alter table test3 add primary key (id);

或者:

alter table test3 modify id int primary key;

1.4 删除主键约束

alter table test3 drop primary key;

2、唯一约束,unique

约束的字段不为空,当只约束一个字段的时候,显示的是UNI,若修饰多个字段,显示的是MUL

create table test4(
id int,
name varchar(20),
unique(name)
);

create table test4(
id int,
name varchar(20) unique
);

2.1 当创建表好了之后添加约束

create table test4(
id int,
name varchar(20)
);

alter table test4 add unique(name);

或者

alter table test4 modify name varchar(20) unique;

mysql> desc test4;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | YES  |     | NULL    |       |
| name  | varchar(20) | YES  | UNI | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set

2.2 约束多个字段,都不能为空,只要组合键不重复就行,单个键重复不影响

create table test4(
id int,
name varchar(20),
unique (id,name)
);

mysql> desc test4;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | YES  | MUL | NULL    |       |
| name  | varchar(20) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set

insert into test4 values (1,‘lisi‘);
insert into test4 values (2,‘lisi‘);

2.3 删除约束

即使是联合约束,相当于查找汉字的首字母和具体拼写一样,这种联合约束,只能直接删除主要的约束(首字母),并且删除掉这个约束后,所有的约束均删除了 联合约束只能删除主要约束,并且主要约束删除了,所有约束都删除了

alter table test4 drop index name;
1091 - Can‘t DROP ‘name‘; check that column/key exists

alter table test4 drop index id;
Query OK, 2 rows affected
Records: 2  Duplicates: 0  Warnings: 0

3、 primary_key 、 unique 区别

  • primary key = unique + not null
  • UNIQUED 可空,可以在一个表里的一个或多个字段定义;PRIMARY KEY 不可空不可重复,在一个表里可以定义联合主键;

参考资料:
https://www.bilibili.com/video/av39807944/?p=12 https://blog.csdn.net/nanaMasuda/article/details/52543177

原文地址:https://www.cnblogs.com/Stephanie-boke/p/11675198.html

时间: 2024-08-26 08:19:32

19、约束之间的比较:主键约束、联合约束、唯一约束、外键约束的相关文章

未能启用约束。一行或多行中包含违反非空、唯一或外键约束的值。

来源:http://www.cnblogs.com/JuneZhang/archive/2013/01/10/2853981.html 今天运行项目,提示“未能启用约束.一行或多行中包含违反非空.唯一或外键约束的值.”的异常信息. 在网上找了查了一些原因:http://www.cnblogs.com/muzihai1988/archive/2011/05/04/2036502.html 原因分析:强类型的DataTable和SQL语句查询出的结果不匹配. 简单说就是强类型的DataTable比S

hibernate中基于主键映射1-1关联关系和基于外键映射1-1关联关系的不同

基于主键映射1-1关联关系和基于外键映射1-1关联关系的不同,主要区别是在配置映射文件上会有区别 两个持久化类为Manager和Department 1:基于主键映射1-1关联关系 1)使用其他持久化类的主键生成主键的实体的映射文件 首先需要指定主键生成方式为foreigner 格式为: <id name="departmentId" type="java.lang.Integer"> <column name="department_i

把联合主键作为另一个表的外键

1.问题:如果表A(a int ,b int),其中a,b 是联合主键; 表B(a int,b int,c int),c是B的主键,其中a,b是外键对A的a,b ,问如何实现? 2.实现: create table A( a int, b int ); create table B( a int, b int, c int  primary key ); alter table A add constraint Primary Key(a,b); alter table B constraint

mysql--外键(froeign key)-----------MySQL外键使用详解

如果一个实体的某个字段指向另一个实体的主键,就称为外键被指向的实体,称之为主实体(主表),也叫父实体(父表).负责指向的实体,称之为从实体(从表),也叫子实体(子表) 作用:用于约束处于关系内的实体增加子表记录时,是否有与之对应的父表记录 如果主表没有相关的记录,从表不能插入 先插入主表数据后再插入从表数据: 在删除或者更新主表记录时,从表应该如何处理相关的记录 设置级联操作:在主表数据发生改变时,与之关联的从表数据应该如何处理    使用关键字:     on update     on de

Sql Server 主键 外键约束

主键约束 表通常具有包含唯一标识表中每一行的值的一列或一组列. 这样的一列或多列称为表的主键 (PK),用于强制表的实体完整性. 由于主键约束可保证数据的唯一性,因此经常对标识列定义这种约束. 如果为表指定了主键约束, 数据库引擎 将通过为主键列自动创建唯一索引来强制数据的唯一性. 当在查询中使用主键时,此索引还允许对数据进行快速访问. 如果对多列定义了主键约束,则一列中的值可能会重复,但来自主键约束定义中所有列的值的任何组合必须唯一. 如下图所示, Purchasing.ProductVend

Oracle存储过程update受外键约束的主键值时完整性冲突解决方案

1.问题背景 虽然在数据库操作中我们并不提倡修改主键,但是确实在实际生活中有这样的业务需求: 表A有主键KA,表B中声明了一个references A(KA)的外键约束,我们需要修改A中某条目KA的值并且更新B中外键约束. 但是DBMS在执行了第一条update后检查完整性会发现冲突:B中条目的外键不存在. 注:我在Oracle database环境下遇到这个问题的,Oracle很蛋疼的不能设置外键为update级连,所以只有人工处理. 2.举例说明 用一个简单的例子说明,数据库中有以下三个表:

ORACLE: 查询(看)表的主键、外键、唯一性约束和索引

ORACLE: 查询(看)表的主键.外键.唯一性约束和索引 1.查找表的所有索引(包括索引名,类型,构成列) select t.*,i.index_type from user_ind_columns t,user_indexes i where t.index_name = i.index_name and t.table_name = i.table_name and t.table_name = 表名 2.查找表的主键(包括名称,构成列): select cu.* from user_co

FOREIGN KEY 外键约束; UNIQUE和PRIMARY KEY 主键约束、CREATE INDEX建立索引的使用

1)foreign key 是个约束,意思是说如果你给A字段设置了外键约束,以后你要往A字段插入数据,这个数据一定是要在foreign key 后面跟的那个字段中存在的值.这个的意义就是约束了数据的完整性,不会插入错误的数据. 修改添加t_topic外键约束: ALTER TABLE t_topic ADD CONSTRAINT fk_userTopics FOREIGN KEY (user_id) REFERENCES t_users(id) 删除表t_topic外键: ALTER TABLE

外键约束 以及 数据库中实体的对应关系(1==1,1==n,n==n)

1.1.1 外键约束 Create database day16; Use day16; 创建部门表: create table dept( did int primary key auto_increment, dname varchar(20) ); insert into dept values (null,'研发部'); insert into dept values (null,'教研部'); insert into dept values (null,'市场部'); 创建员工表: c

mysql数据库,外键约束和表关系

E-R 图 (实体关系模型) E-R图也称实体-联系图(Entity Relationship Diagram), 提供了表示实体类型.属性和联系的方法,用来描述现实世界的概念模型. 它是描述现实世界关系概念模型的有效方法. 是表示概念关系模型的一种方式. 用"矩形框"表示实体型,矩形框内写明实体名称: 用"椭圆图框"表示实体的属性,并用"实心线段"将其与相应关系的"实体型"连接起来: 用"菱形框"表示实体