SQL自学,mysql从入门到精通 --- 第 14天,主键、外键的使用

1.主键

PRIMARY KEY 主键的使用

字段值不允许重复,且不允许赋NULL值

创建主键

sql 复制代码
root@mysqldb 10:11:  [d1]> CREATE TABLE t3(
    -> name varchar(10) PRIMARY KEY,
    -> age int,
    -> class varchar(8)
    -> );
Query OK, 0 rows affected (0.01 sec)
sql 复制代码
root@mysqldb 10:12:  [d1]> create table  t4 (
    -> name char(10), pay float(7,2) default  20000,
    -> primary key(name)
    -> );
Query OK, 0 rows affected (0.01 sec)
sql 复制代码
-- 创建复合主键
root@mysqldb 10:15:  [d1]> create  table t5( 
    -> cip char(15) , port int  , stuat enum("yes","no") , 
    -> primary key(cip , port ) );
Query OK, 0 rows affected (0.01 sec)

删除主键

ALTER TABLE 表名 DROP PRIMARY KEY;

sql 复制代码
root@mysqldb 10:16:  [d1]> ALTER TABLE t4 DROP PRIMARY KEY;
Query OK, 0 rows affected (0.15 sec)
Records: 0  Duplicates: 0  Warnings: 0
sql 复制代码
-- 在已有的表中添加主键
root@mysqldb 10:20:  [d1]> DESC t5;
+-------+------------------+------+-----+---------+-------+
| Field | Type             | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+-------+
| cip   | char(15)         | NO   | PRI | NULL    |       |
| port  | int(11)          | NO   | PRI | NULL    |       |
| stuat | enum('yes','no') | YES  |     | NULL    |       |
+-------+------------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

root@mysqldb 10:21:  [d1]> ALTER TABLE t5 DROP PRIMARY KEY;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

root@mysqldb 10:21:  [d1]> DESC t5;
+-------+------------------+------+-----+---------+-------+
| Field | Type             | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+-------+
| cip   | char(15)         | NO   |     | NULL    |       |
| port  | int(11)          | NO   |     | NULL    |       |
| stuat | enum('yes','no') | YES  |     | NULL    |       |
+-------+------------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

-- 添加复合主键
root@mysqldb 10:23:  [d1]> ALTER TABLE t5 ADD PRIMARY KEY(cip, port);
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

-- 添加主键
root@mysqldb 10:24:  [d1]> ALTER TABLE t4 ADD PRIMARY KEY(name);
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

主键与 AUTO_INCREMENT 连用,字段值自增长

sql 复制代码
root@mysqldb 10:25:  [d1]> create table  t8 ( id  int  primary key  auto_increment ,
    ->  name  char(10) , age tinyint , sex enum("m","g") , homeaddr char(10) );
Query OK, 0 rows affected (0.01 sec)

root@mysqldb 10:27:  [d1]> insert into t8 (name,age,sex,homeaddr)values("tom",19,"m","usa");
Query OK, 1 row affected (0.01 sec)

root@mysqldb 10:27:  [d1]> insert into t8 (name,age,sex,homeaddr)values("jerry",19,"m","usa");
Query OK, 1 row affected (0.00 sec)

root@mysqldb 10:27:  [d1]> insert into t8 (name,age,sex,homeaddr)values("lucy",19,"m","usa");
Query OK, 1 row affected (0.00 sec)

root@mysqldb 10:27:  [d1]> select  * from  t8;
+----+-------+------+------+----------+
| id | name  | age  | sex  | homeaddr |
+----+-------+------+------+----------+
|  1 | tom   |   19 | m    | usa      |
|  2 | jerry |   19 | m    | usa      |
|  3 | lucy  |   19 | m    | usa      |
+----+-------+------+------+----------+
3 rows in set (0.00 sec)

root@mysqldb 10:27:  [d1]> insert into t8  values( 8 ,"lucy",29,"m","usa");
Query OK, 1 row affected (0.00 sec)

root@mysqldb 10:27:  [d1]> insert into t8 (name,age,sex,homeaddr)values("jerry",29,"m","usa");
Query OK, 1 row affected (0.00 sec)

root@mysqldb 10:27:  [d1]> insert into  t8 values (null , "summer" , 28 , "g" , "china" );
Query OK, 1 row affected (0.00 sec)

root@mysqldb 10:28:  [d1]> select  * from  t8;
+----+--------+------+------+----------+
| id | name   | age  | sex  | homeaddr |
+----+--------+------+------+----------+
|  1 | tom    |   19 | m    | usa      |
|  2 | jerry  |   19 | m    | usa      |
|  3 | lucy   |   19 | m    | usa      |
|  8 | lucy   |   29 | m    | usa      |
|  9 | jerry  |   29 | m    | usa      |
| 10 | summer |   28 | g    | china    |
+----+--------+------+------+----------+
6 rows in set (0.00 sec)

2.外键

限制字段赋值,插入记录时,字段值在另一个表字段值范围内选择。

sql 复制代码
-- 建表
root@mysqldb 10:31:  [d1]> create table yg_tab(
    -> yg_id  int  primary key auto_increment,
    -> user char (10), 
    -> sex  enum("man","woman")
    -> )engine=innodb;
Query OK, 0 rows affected (0.01 sec)

root@mysqldb 10:31:  [d1]> create table gz_tab(
    -> gz_id  int , pay  float(7,2),
    -> foreign key(gz_id)  references yg_tab(yg_id) 
    -> on  update cascade   on  delete cascade )engine=innodb ;
Query OK, 0 rows affected (0.01 sec)
sql 复制代码
-- 查看建表语句
root@mysqldb 10:32:  [d1]> show create table yg_tab;
+--------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table  | Create Table                                                                                                                                                                                              |
+--------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| yg_tab | CREATE TABLE `yg_tab` (
  `yg_id` int(11) NOT NULL AUTO_INCREMENT,
  `user` char(10) DEFAULT NULL,
  `sex` enum('man','woman') DEFAULT NULL,
  PRIMARY KEY (`yg_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+--------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)


root@mysqldb 10:33:  [d1]> show create table yg_tab \G
*************************** 1. row ***************************
       Table: yg_tab
Create Table: CREATE TABLE `yg_tab` (
  `yg_id` int(11) NOT NULL AUTO_INCREMENT,
  `user` char(10) DEFAULT NULL,
  `sex` enum('man','woman') DEFAULT NULL,
  PRIMARY KEY (`yg_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
sql 复制代码
-- 删除外键
root@mysqldb 10:36:  [d1]> alter table  gz_tab  drop  foreign key gz_tab_ibfk_1 ;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0
sql 复制代码
-- 在已有表添加外键
root@mysqldb 10:37:  [d1]> alter table gz_tab add
    -> foreign key(gz_id) references yg_tab(yg_id) on update cascade on delete cascade;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0
sql 复制代码
root@mysqldb 10:37:  [d1]> select  * from  yg_tab;
Empty set (0.00 sec)

-- 插入数据会报错
root@mysqldb 10:37:  [d1]> insert into gz_tab values (1,20000);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`d1`.`gz_tab`, CONSTRAINT `gz_tab_ibfk_1` FOREIGN KEY (`gz_id`) REFERENCES `yg_tab` (`yg_id`) ON DELETE CASCADE ON UPDATE CASCADE)

root@mysqldb 10:39:  [d1]> insert into yg_tab(user,sex)values("bob","man");
Query OK, 1 row affected (0.01 sec)

root@mysqldb 10:39:  [d1]> insert into yg_tab(user,sex)values("lucy","woman");
Query OK, 1 row affected (0.00 sec)

root@mysqldb 10:39:  [d1]> select  * from yg_tab;
+-------+------+-------+
| yg_id | user | sex   |
+-------+------+-------+
|     1 | bob  | man   |
|     2 | lucy | woman |
+-------+------+-------+
2 rows in set (0.00 sec)


root@mysqldb 10:40:  [d1]> insert into gz_tab values (1,20000);
Query OK, 1 row affected (0.00 sec)

root@mysqldb 10:40:  [d1]> insert into gz_tab values (2,20000);
Query OK, 1 row affected (0.00 sec)

root@mysqldb 10:40:  [d1]> insert into gz_tab values (3,20000);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`d1`.`gz_tab`, CONSTRAINT `gz_tab_ibfk_1` FOREIGN KEY (`gz_id`) REFERENCES `yg_tab` (`yg_id`) ON DELETE CASCADE ON UPDATE CASCADE)
root@mysqldb 10:40:  [d1]> insert into  yg_tab(user,sex)values("lili","woman");
Query OK, 1 row affected (0.00 sec)

root@mysqldb 10:40:  [d1]> insert into gz_tab values(3,40000);
Query OK, 1 row affected (0.00 sec)

root@mysqldb 10:40:  [d1]> select  * from gz_tab;
+-------+----------+
| gz_id | pay      |
+-------+----------+
|     1 | 20000.00 |
|     2 | 20000.00 |
|     3 | 40000.00 |
+-------+----------+
3 rows in set (0.00 sec)
sql 复制代码
root@mysqldb 10:40:  [d1]> update  yg_tab set yg_id=8 where yg_id=2 ;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

root@mysqldb 10:41:  [d1]> delete from yg_tab where yg_id=8;
Query OK, 1 row affected (0.00 sec)

root@mysqldb 10:41:  [d1]> alter table gz_tab add primary key(gz_id);
Query OK, 0 rows affected (0.05 sec)
Records: 0  Duplicates: 0  Warnings: 0
相关推荐
福娃筱欢1 分钟前
SQLServer迁移至KES SQLServer模式 问题整理
数据库·oracle·sqlserver
hflmwl88 分钟前
RedisDesktopManager安装包中文版官方下载,redis可视化客户端工具下载
数据库·redis·缓存·可视化客户端工具
FluxDB32 分钟前
《用 Rust + GPUI 做了一个开源数据库客户端:FluxDB》
数据库
roman_日积跬步-终至千里32 分钟前
【数据Agent论文·查询与语义|09】Spider 2.0:从生成SQL走向完成企业工作流
数据库·sql·数据分析
曦夜日长33 分钟前
MySQL系统篇,数据库基础(二):数据库概念、SQL 分类与存储引擎
数据库·sql·mysql
泡海椒34 分钟前
JQuick-SQL AST 解析:从 SQL 文本到强类型节点
数据库·sql
要开心吖ZSH38 分钟前
SeaTunnel + Doris + MySQL-CDC 数据同步故障排查个人笔记
数据库·mysql·doris·seatunnel·mysql cdc
泡海椒1 小时前
JQuick-SQL 模块架构:从 SQL AST 到分布式执行
分布式·sql·架构
data analyse 4561 小时前
Session数怎么计算?明确会话切分、超时与跨页规则
java·服务器·数据库
骑着蜗牛撵大象3271 小时前
ToolJet + PostgreSQL:后台表格、查询和流程,一次搭成可远程访问的业务系统
数据库·低代码·docker·postgresql·内部工具·tooljet