GVKun编程网logo

mysql怎么取消外键限制(约束)?(mysql如何取消外键约束)

25

如果您对mysql怎么取消外键限制和约束?感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解mysql怎么取消外键限制的各种细节,并对约束?进行深入的分析,此外还有关于MySQL删除所有表的外键约

如果您对mysql怎么取消外键限制约束?感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解mysql怎么取消外键限制的各种细节,并对约束?进行深入的分析,此外还有关于MySQL 删除所有表的外键约束、禁用外键约束、mysql 建表约束(唯一约束)、mysql 数据库 III(约束)、mysql中外键约束怎么创建的实用技巧。

本文目录一览:

mysql怎么取消外键限制(约束)?(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 删除所有表的外键约束、禁用外键约束

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 建表约束(唯一约束)

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(约束)

mysql 数据库 III(约束)

1. 今日内容

  1. not null 非空约束,指定某列不能为空

  2. defauit 设置默认值

  3. unique 唯一约束,指定某列或者几列组合不能重复

    • 唯一
    • 联合唯一
  4. auto_increment

    • 自增。针对 int

    • 自带。not null

    • 前提。需要设置 unique

  5. primary key 主键,指定该列的值可以为宜地标识该列记录

    • 相当于 :非空 + 唯一
    • 一张表只能有一个,并且必须有一个
    • 联合主键
  6. 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 KEY id (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中外键约束怎么创建

在 mysql 中创建外键约束可强制子表记录关联主表记录,保障数据完整性。具体步骤包括:1. 指定子表的外键列;2. 引用主表的唯一索引列;3. 可设置级联删除或更新操作(可选)。

mysql中外键约束怎么创建

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中外键约束怎么创建的详细内容,更多请关注php中文网其它相关文章!

今天关于mysql怎么取消外键限制约束?的分享就到这里,希望大家有所收获,若想了解更多关于MySQL 删除所有表的外键约束、禁用外键约束、mysql 建表约束(唯一约束)、mysql 数据库 III(约束)、mysql中外键约束怎么创建等相关知识,可以在本站进行查询。

本文标签: