如果您对mysql怎么取消外键限制和约束?感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解mysql怎么取消外键限制的各种细节,并对约束?进行深入的分析,此外还有关于MySQL删除所有表的外键约
如果您对mysql怎么取消外键限制和约束?感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解mysql怎么取消外键限制的各种细节,并对约束?进行深入的分析,此外还有关于MySQL 删除所有表的外键约束、禁用外键约束、mysql 建表约束(唯一约束)、mysql 数据库 III(约束)、mysql中外键约束怎么创建的实用技巧。
本文目录一览:- mysql怎么取消外键限制(约束)?(mysql如何取消外键约束)
- MySQL 删除所有表的外键约束、禁用外键约束
- mysql 建表约束(唯一约束)
- mysql 数据库 III(约束)
- mysql中外键约束怎么创建
mysql怎么取消外键限制(约束)?(mysql如何取消外键约束)
MysqL取消外键限制(约束)的方法:通过“ALTER TABLE <表名> DROP FOREIGN KEY <外键约束名>;”语句来取消;外键一旦删除,就会解除主表和从表间的关联关系。
MysqL 外键约束(FOREIGN KEY)是表的一个特殊字段,经常与主键约束一起使用。对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表(父表),外键所在的表就是从表(子表)。
外键用来建立主表与从表的关联关系,为两个表的数据建立连接,约束两个表中数据的一致性和完整性。比如,一个水果摊,只有苹果、桃子、李子、西瓜等 4 种水果,那么,你来到水果摊要买水果就只能选择苹果、桃子、李子和西瓜,其它的水果都是不能购买的。
MysqL取消外键限制(约束)的方法
当一个表中不需要外键约束时,就需要从表中将其删除。外键一旦删除,就会解除主表和从表间的关联关系。
删除外键约束的语法格式如下所示:
ALTER TABLE <表名> DROP FOREIGN KEY <外键约束名>;
示例
删除数据表 tb_emp2 中的外键约束 fk_tb_dept1,sql 语句和运行结果如下所示。
MysqL> ALTER TABLE tb_emp2 -> DROP FOREIGN KEY fk_tb_dept1; Query OK, 0 rows affected (0.19 sec) Records: 0 Duplicates: 0 Warnings: 0 MysqL> SHOW CREATE TABLE tb_emp2\G *************************** 1. row *************************** Table: tb_emp2 Create Table: CREATE TABLE `tb_emp2` ( `id` int(11) NOT NULL, `name` varchar(30) DEFAULT NULL, `deptId` int(11) DEFAULT NULL, `salary` float DEFAULT NULL, PRIMARY KEY (`id`), KEY `fk_tb_dept1` (`deptId`) ) ENGINE=InnoDB DEFAULT CHARSET=gb2312 1 row in set (0.00 sec)
可以看到,tb_emp2 中已经不存在 FOREIGN KEY,原有的名称为 fk_emp_dept 的外键约束删除成功。
推荐教程:mysql视频教程
MySQL 删除所有表的外键约束、禁用外键约束
数据库的外键虽然能保证数据数据一致性和完整性,但是也一定程度地影响了数据更新的性能。在开发中,我们使用 PowerDesigner 建立物理数据模型时,为了结构的清晰,增加可读性,会创建表与表之间的关联关系。
在实际开发中,数据库中一般不会存在外键,阿里的开发手册中也强制不使用外键与级联操作,一切外键概念必须在应用层解决。如果数据库中已存在外键了,怎么办呢?
删除所有表的外键
查询 schema 中所有外键名称然后拼接生成删除语句,再执行。
SELECT CONCAT(''ALTER TABLE '',TABLE_SCHEMA,''.'',TABLE_NAME,'' DROP FOREIGN KEY '',CONSTRAINT_NAME,'' ;'')
FROM information_schema.TABLE_CONSTRAINTS c
WHERE c.TABLE_SCHEMA='' 库名 '' AND c.CONSTRAINT_TYPE=''FOREIGN KEY'';
1
2
3
修改 MySQL 变量 FOREIGN_KEY_CHECKS
-- 禁用外键约束
SET FOREIGN_KEY_CHECKS = 0
-- 启用外键约束
SET FOREIGN_KEY_CHECKS = 1;
1
2
3
4
由于 FOREIGN_KEY_CHECKS 是基于 session 的,当关闭了 session 重新建立连接,这个变量就会恢复默认值,也就是开启外键约束,当然我们也可以全局的 FOREIGN_KEY_CHECKS 变量。
SET GLOBAL FOREIGN_KEY_CHECKS = 0;
1
或者:
SET @@GLOBAL.FOREIGN_KEY_CHECKS = 0;
1
修改完成后,我们可以查看修改后的结果
SELECT @@FOREIGN_KEY_CHECKS;
---------------------
作者:李阿飞
来源:CSDN
原文:https://blog.csdn.net/junlovejava/article/details/78360253
版权声明:本文为博主原创文章,转载请附上博文链接!
mysql 建表约束(唯一约束)
--唯一约束
unique 表中字段内容唯一,只有一个。
-- 直接加到字段名后面
create TABLE data3(
id int unique, //添加唯一约束
sname varchar(20),
ssex varchar(2)
)
-- 类似联合主键的多个添加
create TABLE data3(
id int ,
sname varchar(20),
ssex varchar(2),
UNIQUE(id,sname) //添加多个唯一约束的方式
)
-- 通过 alter 添加
create TABLE data3(
id int ,
sname varchar(20),
ssex varchar(2)
)
alter table data3 add unique(id);
-- 删除 unique
create TABLE data3(
id int ,
sname varchar(20),
ssex varchar(2)
)
alter table data3 drop index id;
-- 通过 modfiy 添加 unique
create TABLE data3(
id int ,
sname varchar(20),
ssex varchar(2)
)
alter table data3 modify sname varchar(20) unique;
mysql 数据库 III(约束)
1. 今日内容
-
not null 非空约束,指定某列不能为空
-
defauit 设置默认值
-
unique 唯一约束,指定某列或者几列组合不能重复
- 唯一
- 联合唯一
-
auto_increment
-
自增。针对 int
-
自带。not null
-
前提。需要设置 unique
-
-
primary key 主键,指定该列的值可以为宜地标识该列记录
- 相当于 :非空 + 唯一
- 一张表只能有一个,并且必须有一个
- 联合主键
-
foreign key 外键,指定该行记录从属于主表中的一条记录,主要用于参照完整性
- 外键约束
- 约束的字段至少 unique
- 级联删除: on delete cascade
- 级联更新: on update cascade
- 外键约束
-
not null 不能为空
<details> <summary>not null 示例 </summary> ```mysql mysql> create database day39; Query OK, 1 row affected (0.00 sec)
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | day39 | | mes | | mysql | | performance_schema | | sys | +--------------------+ 6 rows in set (0.01 sec)
mysql> use day39 Database changed mysql> create table t1(id int not null); Query OK, 0 rows affected (0.03 sec)
mysql> show tables; +-----------------+ | Tables_in_day39 | +-----------------+ | t1 | +-----------------+ 1 row in set (0.00 sec)
mysql> desc t1; +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | id | int(11) | NO | | NULL | | +-------+---------+------+-----+---------+-------+ 1 row in set (0.02 sec)
#不能向 id 列插入空元素 mysql> insert into t1 values (null); ERROR 1048 (23000): Column ''id'' cannot be null
mysql> insert into t1 values (1); Query OK, 1 row affected (0.01 sec)
mysql> select * from t1; +----+ | id | +----+ | 1 | +----+ 1 row in set (0.00 sec)
</details>
-
defauit 设置默认值
默认值,创建列时可以指定默认值,当插入数据时如果未主动设置,则自动添加默认值
<details> <summary>defauit 示例 </summary> ```mysql mysql> create table t2 (id int not null, id2 int not null default 222); Query OK, 0 rows affected (0.01 sec)
mysql> desc t2; +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | id | int(11) | NO | | NULL | | | id2 | int(11) | NO | | 222 | | +-------+---------+------+-----+---------+-------+ 2 rows in set (0.00 sec)
#只向 id 字段添加值,会发现 id2 字段会使用默认值填充 mysql> insert into t2 (id) values (111); Query OK, 1 row affected (0.01 sec)
mysql> select * from t2; +-----+-----+ | id | id2 | +-----+-----+ | 111 | 222 | +-----+-----+ 1 row in set (0.00 sec)
#id 字段不能为空,所以不能单独向 id2 字段填充 mysql> insert into t2 (id2) values (212); #ERROR 1364 (HY000): Field ''id'' doesn''t have a default value
#向 id、id2 字段分别填充数据,id2 的填充数据会覆盖默认值 mysql> insert into t2 (id ,id2) values (123,234); Query OK, 1 row affected (0.00 sec)
mysql> select * from t2; +-----+-----+ | id | id2 | +-----+-----+ | 111 | 222 | | 123 | 234 | +-----+-----+ 2 rows in set (0.01 sec)
</details> + 设置严格模式 ```mysql 设置严格模式: 不支持对not null 字段插入null值; 不支持对自增长字段插入值; 不支持text字段有默认值; 直接在mysql中生效(重启): mysql> set sql_mide = "STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"; 配置文件添加(永久生效): sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
-
unique
唯一约束,指定某列或者几列组合不能重复
- 唯一
unique示例 #方法一 mysql> create table department1( -> id int, -> name varchar(20) unique, -> comment varchar(100) -> ); Query OK, 0 rows affected (0.01 sec) #方法二 mysql> create table department2( -> id int, -> name varchar(20), -> comment varchar(100), -> unique (name) -> ); Query OK, 0 rows affected (0.01 sec) mysql> insert into department1 values(1,''IT'',''技术''); Query OK, 1 row affected (0.01 sec) #name重复报错 mysql> insert into department1 values(1,''IT'',''技术''); ERROR 1062 (23000): Duplicate entry ''IT'' for key ''name''
not null 和 unique的结合 mysql> create table t3( -> id int not null unique -> ); Query OK, 0 rows affected (0.01 sec) mysql> desc t3; +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | +-------+---------+------+-----+---------+-------+ 1 row in set (0.00 sec)
- 联合唯一
mysql> create table service( -> id int primary key auto_increment, -> name varchar(20), -> host varchar(15) not null, -> port int not null, -> unique (host,port) -> ); Query OK, 0 rows affected (0.01 sec) mysql> insert into service values -> (1,''nginx'',''192.168.0.10'',80), -> (2,''haproxy'',''192.168.0.20'',80), -> (3,''mysql'',''192.168.0.30'',3306); Query OK, 3 rows affected (0.00 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> select * from service; +----+---------+--------------+------+ | id | name | host | port | +----+---------+--------------+------+ | 1 | nginx | 192.168.0.10 | 80 | | 2 | haproxy | 192.168.0.20 | 80 | | 3 | mysql | 192.168.0.30 | 3306 | +----+---------+--------------+------+ 3 rows in set (0.01 sec) #host与port重复报错 mysql> insert into service(name,host,port) values(''nginx'',''192.168.0.10'',80); ERROR 1062 (23000): Duplicate entry ''192.168.0.10-80'' for key ''host''
-
auto_increment
-
自增。只能操作数字
-
自带。自带非空属性,not null
-
前提。只对 unique 字段金星设置
-
不受删除影响的
mysql> create table t4( -> id int unique auto_increment, -> name char(12) not null -> ); Query OK, 0 rows affected (0.02 sec) mysql> desc t4; +-------+----------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+----------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | char(12) | NO | | NULL | | +-------+----------+------+-----+---------+----------------+ 2 rows in set (0.00 sec) #不指定id,则自动增长 mysql> insert into t4(name) values (''大圣''); Query OK, 1 row affected (0.00 sec) mysql> select * from t4; +----+--------+ | id | name | +----+--------+ | 1 | 大圣 | +----+--------+ 1 row in set (0.00 sec) #也可以指定id mysql> insert into t4 values (3,''''); Query OK, 1 row affected (0.00 sec) mysql> insert into t4 values (6,''齐天''); Query OK, 1 row affected (0.00 sec) mysql> select * from t4; +----+--------+ | id | name | +----+--------+ | 1 | 大圣 | | 3 | | | 6 | 齐天 | +----+--------+ 3 rows in set (0.00 sec) #对于自增字段,在用delete删除后,再插入值,该字段仍按照删除前的位置继续增长 mysql> delete from t4; Query OK, 3 rows affected (0.01 sec) mysql> insert into t4(name) values (''大圣''); Query OK, 1 row affected (0.00 sec) mysql> select * from t4; +----+--------+ | id | name | +----+--------+ | 7 | 大圣 | +----+--------+ 1 row in set (0.00 sec) #应该用truncate清空表, mysql> truncate t4; Query OK, 0 rows affected (0.01 sec) mysql> insert into t4(name) values (''大圣''); Query OK, 1 row affected (0.00 sec) mysql> select * from t4; +----+--------+ | id | name | +----+--------+ | 1 | 大圣 | +----+--------+ 1 row in set (0.00 sec)
了解
<details> <summary>auto_increment 了解 </summary> ```mysql #在创建表后,修改自增字段的起始值 mysql> alter table t4 auto_increment = 10; Query OK, 0 rows affected (0.02 sec) Records: 0 Duplicates: 0 Warnings: 0
mysql> show create table t4; +-------+-------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +-------+-------------------------------------------------------------------------------------------------------------------------------------------------+ | t4 | CREATE TABLE
t4
(id
int(11) NOT NULL AUTO_INCREMENT,name
char(12) NOT NULL, UNIQUE KEYid
(id
) ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8 | +-------+-------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)mysql> insert into t4 (name) values ('' 奇天 ''); Query OK, 1 row affected (0.00 sec)
mysql> select * from t4; +----+--------+ | id | name | +----+--------+ | 1 | 大圣 | | 10 | 奇天 | +----+--------+ 2 rows in set (0.00 sec)
#也可以在创建表时,指定 auto_increment 的初始值,⚠️初始值的设置为表选项,应该放到括号外 mysql> create table t5 (-> id int primary key auto_increment, -> name varchar (20) -> ) auto_increment = 3; Query OK, 0 rows affected (0.01 sec)
mysql> show create table t5; +-------+--------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +-------+--------------------------------------------------------------------------------------------------------------------------------------------+ | t5 | CREATE TABLE
t5
(id
int(11) NOT NULL AUTO_INCREMENT,name
varchar(20) DEFAULT NULL, PRIMARY KEY (id
) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 | +-------+--------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)</details>
-
-
primary key
主键为了保证表中的每一条数据的该字段都是表哥中的唯一值。也就是说,它是用来唯一确认表格中的每一行数据。
主键可以包含一个字段或多个字段。当主键包含多个字段时,称为组合键,也叫联合主键。
- 相当于 :非空 + 唯一
- 一张表只能有一个,并且必须有一个
- 联合主键
#单字段主键 #方法一:not null + unique mysql> create table department3( -> id int not null unique, #主键 -> name varchar(20) not null unique, -> comment varchar(100));
Query OK, 0 rows affected (0.02 sec)
mysql> desc department3; +---------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+--------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name | varchar(20) | NO | UNI | NULL | | | comment | varchar(100) | YES | | NULL | | +---------+--------------+------+-----+---------+-------+ 3 rows in set (0.00 sec)
#方法二:在某个字段后用 primary key mysql> create table department4 (-> id int primary key, #主键 -> name varchar (20), -> comment varchar (100)); Query OK, 0 rows affected (0.01 sec)
mysql> desc department4; +---------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+--------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name | varchar(20) | YES | | NULL | | | comment | varchar(100) | YES | | NULL | | +---------+--------------+------+-----+---------+-------+ 3 rows in set (0.00 sec)
#方法三:在所有字段后单独定义 primary key mysql> create table department5 (-> id int, -> name varchar (20), -> comment varchar (100), -> primary key (id)); #设置主键 Query OK, 0 rows affected (0.02 sec)
mysql> desc department5; +---------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+--------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name | varchar(20) | YES | | NULL | | | comment | varchar(100) | YES | | NULL | | +---------+--------------+------+-----+---------+-------+ 3 rows in set (0.00 sec)
#方法四:给已经建成的表添加主键约束 mysql> create table department6 (-> id int, -> name varchar (20), -> comment varchar (100)); Query OK, 0 rows affected (0.03 sec)
mysql> desc department6; +---------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+--------------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | name | varchar(20) | YES | | NULL | | | comment | varchar(100) | YES | | NULL | | +---------+--------------+------+-----+---------+-------+ 3 rows in set (0.00 sec)
mysql> alter table department6 modify id int primary key; Query OK, 0 rows affected (0.02 sec) Records: 0 Duplicates: 0 Warnings: 0
mysql> desc department6; +---------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+--------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name | varchar(20) | YES | | NULL | | | comment | varchar(100) | YES | | NULL | | +---------+--------------+------+-----+---------+-------+ 3 rows in set (0.00 sec)
+ ### 多字段主键
```mysql
mysql> create table service1(
-> ip varchar(15),
-> service_name varchar(10) not null,
-> port char(5),
-> primary key (ip,port)); #联合主键
Query OK, 0 rows affected (0.01 sec)
mysql> desc service1;
+--------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+-------+
| ip | varchar(15) | NO | PRI | NULL | |
| service_name | varchar(10) | NO | | NULL | |
| port | char(5) | NO | PRI | NULL | |
+--------------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql> insert into service1 values
-> (''172.16.45.10'',''mysql'',''3306''),
-> (''172.16.45.20'',''mariadb'',''3306'');
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from service1;
+--------------+--------------+------+
| ip | service_name | port |
+--------------+--------------+------+
| 172.16.45.10 | mysql | 3306 |
| 172.16.45.20 | mariadb | 3306 |
+--------------+--------------+------+
2 rows in set (0.00 sec)
#ip与port组合唯一,重复报错
mysql> insert into service1 values(''172.16.45.10'',''nginx'',''3306'');
ERROR 1062 (23000): Duplicate entry ''172.16.45.10-3306'' for key ''PRIMARY''
mysql>
-
foreign key
多表:
假如要描述公司的所有员工,例如:工号,姓名,部门等
假如部门有 3 个,员工 5 千,如果用一张表去存储这些信息,可以看到部门这个字段大量的重复存储,部门名字越长,越浪费
解决方法:再去定义一个部门表,然后让员工表去关联该表,即 foreign key
-
外键约束
- 约束的字段至少 unique
mysql> create table departments( -> dep_id int(4), -> dep_name varchar(11)); Query OK, 0 rows affected (0.01 sec) mysql> desc departments; +----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+-------+ | dep_id | int(4) | YES | | NULL | | | dep_name | varchar(11) | YES | | NULL | | +----------+-------------+------+-----+---------+-------+ 2 rows in set (0.00 sec) mysql> create table staff_info ( -> s_id int, -> name varchar(20), -> dep_id int, -> foreign key(dep_id) references departments(dep_id)); Query OK, 0 rows affected (0.02 sec) mysql> desc departments; +----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+-------+ | dep_id | int(4) | YES | UNI | NULL | | | dep_name | varchar(11) | YES | | NULL | | +----------+-------------+------+-----+---------+-------+ 2 rows in set (0.00 sec) #当设置字段为unique唯一字段时,设置该字段为外键成功 mysql> alter table departments modify dep_id int(4) unique; Query OK, 0 rows affected (0.02 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> create table staff_info ( -> s_id int, -> name varchar(20), -> dep_id int, -> foreign key(dep_id) references departments(dep_id)); Query OK, 0 rows affected (0.02 sec) mysql> desc departments; +----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+-------+ | dep_id | int(4) | YES | UNI | NULL | | | dep_name | varchar(11) | YES | | NULL | | +----------+-------------+------+-----+---------+-------+ 2 rows in set (0.00 sec)
-
外键操作
- 级联删除: on delete cascade
- 级联更新: on update cascade
mysql> create table employee( -> id int primary key, -> name varchar(20) not null, -> dpt_id int, -> foreign key(dpt_id) references departments(dep_id) -> on delete cascade #级连删除 -> on update cascade #级连更新 -> ); Query OK, 0 rows affected (0.02 sec) #给父表departments中插入数据 mysql> insert into departments values -> (1,''质教部''), -> (2,''技术部''), -> (3,''人力资源部''); Query OK, 3 rows affected (0.00 sec) Records: 3 Duplicates: 0 Warnings: 0 #给子表employee中插入记录 mysql> insert into employee values -> (1,''yuan'',1),(2,''nezha'',2),(3,''egon'',2),(4,''alex'',2), -> (5,''wusir'',3), -> (6,''李沁洋'',3), -> (7,''皮卡丘'',3), -> (8,''程咬金'',3), -> (9,''程咬银'',3); Query OK, 9 rows affected (0.01 sec) Records: 9 Duplicates: 0 Warnings: 0 mysql> select * from employee; +----+-----------+--------+ | id | name | dpt_id | +----+-----------+--------+ | 1 | yuan | 1 | | 2 | nezha | 2 | | 3 | egon | 2 | | 4 | alex | 2 | | 5 | wusir | 3 | | 6 | 李沁洋 | 3 | | 7 | 皮卡丘 | 3 | | 8 | 程咬金 | 3 | | 9 | 程咬银 | 3 | +----+-----------+--------+ 9 rows in set (0.00 sec) #删除父表departments中的数据,子表employee中对应的记录也被删除 mysql> delete from departments where id = 2; ERROR 1054 (42S22): Unknown column ''id'' in ''where clause'' mysql> delete from departments where dep_id = 2; Query OK, 1 row affected (0.02 sec) mysql> select * from employee; +----+-----------+--------+ | id | name | dpt_id | +----+-----------+--------+ | 1 | yuan | 1 | | 5 | wusir | 3 | | 6 | 李沁洋 | 3 | | 7 | 皮卡丘 | 3 | | 8 | 程咬金 | 3 | | 9 | 程咬银 | 3 | +----+-----------+--------+ 6 rows in set (0.00 sec) #更新父表departments中的数据,子表employee中对应的记录也被更新 mysql> update departments set dep_id = 4 where dep_id = 1; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from employee; +----+-----------+--------+ | id | name | dpt_id | +----+-----------+--------+ | 1 | yuan | 4 | | 5 | wusir | 3 | | 6 | 李沁洋 | 3 | | 7 | 皮卡丘 | 3 | | 8 | 程咬金 | 3 | | 9 | 程咬银 | 3 | +----+-----------+--------+ 6 rows in set (0.00 sec)
-
mysql中外键约束怎么创建
在 mysql 中创建外键约束可强制子表记录关联主表记录,保障数据完整性。具体步骤包括:1. 指定子表的外键列;2. 引用主表的唯一索引列;3. 可设置级联删除或更新操作(可选)。
MySQL 中创建外键约束
外键约束是一种数据库约束,用于确保表中的数据完整性。它强制子表中的每个记录都引用主表中的一个现有的记录。
如何创建外键约束
在 MySQL 中,可以通过在创建子表时指定外键约束来创建外键约束。语法如下:
CREATE TABLE child_table ( child_column INT NOT NULL, PRIMARY KEY (child_column), FOREIGN KEY (child_column) REFERENCES parent_table (parent_column) );
其中:
- child_table 是子表名称。
- parent_table 是主表名称。
- child_column 是子表中的外键列。
- parent_column 是主表中的引用列。
外键约束的含义
外键约束创建后,将强制执行以下规则:
- 子表中的每个记录必须引用主表中的一个现有记录。
- 如果主表中的被引用记录被删除,则子表中的引用记录也将被删除(级联删除)。
- 如果主表中的被引用记录被更新,则子表中的引用记录也将被更新(级联更新)。
使用外键约束的好处
使用外键约束有很多好处:
- 确保数据完整性:外键约束可防止在子表中插入指向不存在记录的外键值。
- 强制数据关联:外键约束强制子表中的记录与主表中的记录相关联。
- 简化数据维护:外键约束简化了数据的维护,因为当主表中的记录被删除或更新时,子表中的记录将自动更新或删除。
注意
- 主表中的列必须有唯一索引:外键列必须引用主表中的有唯一索引的列。
- 外键列必须在子表中存在:外键列必须是子表中的现有列。
- 级联删除和更新操作是可选的:可以通过指定 ON DELETE CASCADE 和 ON UPDATE CASCADE 选项来启用级联删除和更新操作。
以上就是
今天关于mysql怎么取消外键限制和约束?的分享就到这里,希望大家有所收获,若想了解更多关于MySQL 删除所有表的外键约束、禁用外键约束、mysql 建表约束(唯一约束)、mysql 数据库 III(约束)、mysql中外键约束怎么创建等相关知识,可以在本站进行查询。
本文标签: