目录
说明
一、如果要使用外键,表的存储引擎选择哪个?
1.1 答
1.2 示范
1.2.1 主表
(1)MyISAM的表:masterTable2
(2)InnoDB的表:masterTable1
1.2.2 从表
(1)外键是MyISAM的表(提示错误)
(2)外键是InnoDB的表(创建成功)
二、外键的主要作用是什么?
三、外键可以为null吗?
四、设置外键跟设置唯一键有什么区别?
五、为何主键和唯一键没建索引,却已有索引?
六、设置外键的列必须设置唯一键吗?
6.1 答
6.2 示范
(1)主表(userId不是唯一键,也不是主键)
(2)从表(创建失败)
说明
(1)下面的所有举例,只要表名一样,就表示是说的同一个表。
(2)mysql版本号
一、如果要使用外键,表的存储引擎选择哪个?
1.1 答
mysql表的存储引擎要是InnoDB。
且外键的两个表存储引擎必须相同。
这是因为MyISAM和InnoDB是MySQL中两种不同的存储引擎。
它们的设计目标和重点不同,MyISAM不支持事务及外键,InnoDB支持事务及外键。
MyISAM的设计目标是快速读取,适用于读取频繁的应用程序。
而InnoDB的设计目标是支持高并发的事务处理,适用于写入频繁的应用程序。
1.2 示范
1.2.1 主表
(1)MyISAM的表:masterTable2
CREATE TABLE masterTable2 (
id bigint(20) NOT NULL AUTO_INCREMENT,
userId bigint(20) DEFAULT NULL,
name varchar(255) DEFAULT NULL,
phone varchar(20) DEFAULT NULL,
PRIMARY KEY (id),
UNIQUE KEY UK_2 (userId)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
查看表数据存储引擎:
SHOW TABLE STATUS LIKE 'mastertable2';
(2)InnoDB的表:masterTable1
CREATE TABLE masterTable1 (
id bigint(20) NOT NULL AUTO_INCREMENT,
userId bigint(20) DEFAULT NULL,
name varchar(255) DEFAULT NULL,
phone varchar(20) DEFAULT NULL,
PRIMARY KEY (id),
UNIQUE KEY UK_1 (userId)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
查看表数据存储引擎:
SHOW TABLE STATUS LIKE 'mastertable1';
1.2.2 从表
(1)外键是MyISAM的表(提示错误)
CREATE TABLE slaveTable (
id bigint(20) NOT NULL AUTO_INCREMENT,
userId bigint(20) DEFAULT NULL,
name varchar(255) NOT NULL,
phone varchar(20) DEFAULT NULL,
PRIMARY KEY (id),
constraint FK_1 foreign key(userId) references masterTable2(userId)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
(2)外键是InnoDB的表(创建成功)
CREATE TABLE slaveTable (
id bigint(20) NOT NULL AUTO_INCREMENT,
userId bigint(20) DEFAULT NULL,
name varchar(255) NOT NULL,
phone varchar(20) DEFAULT NULL,
PRIMARY KEY (id),
constraint FK_1 foreign key(userId) references masterTable1(userId)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
二、外键的主要作用是什么?
保持数据的一致性、完整性。
三、外键可以为null吗?
mysql 数据库 外键允许为 null or 空。
插入数据:
insert into masterTable1 (userId, name, phone) values (1, "1我是谁", 1234);
insert into masterTable1 (userId, name, phone) values (null, "1我是谁", 1234);
insert into slaveTable (userId, name, phone) values (null, "slave1", 1234);
insert into slaveTable (userId, name, phone) values (1, "slave22", 12345);
主表数据:
从表数据,外键有null的情况:
四、设置外键跟设置唯一键有什么区别?
两者是两个内容。
外键:一个表可以有多个列是外键。
唯一键:一个表可以有多个列是唯一键。
五、为何主键和唯一键没建索引,却已有索引?
那是因为MySQL默认在建立主键或者唯一键的时候,就建立了索引。
六、设置外键的列必须设置唯一键吗?
6.1 答
外键在从表中。
外键的建立原则:外键引用的那个列在主表中必须是主键列或者唯一列。
6.2 示范
(1)主表(userId不是唯一键,也不是主键)
CREATE TABLE masterTable3 (
id bigint(20) NOT NULL AUTO_INCREMENT,
userId bigint(20) DEFAULT NULL,
name varchar(255) DEFAULT NULL,
phone varchar(20) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
(2)从表(创建失败)
CREATE TABLE slaveTable3 (
id bigint(20) NOT NULL AUTO_INCREMENT,
userId bigint(20) DEFAULT NULL,
name varchar(255) NOT NULL,
phone varchar(20) DEFAULT NULL,
PRIMARY KEY (id),
constraint FK_11 foreign key(userId) references masterTable3(userId)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
我是程序员娟娟,
致力将工作中遇到的问题和解决方案记录下来,
分享给更多需要的同行。
如果对你有帮助,不妨点个关注吧!