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
相关推荐
layman052825 分钟前
node.js 实战——mongoDB
数据库·mongodb·node.js
爱可生开源社区1 小时前
SQLShift 全新上线:Oracle→OceanBase 迁移利器
数据库
wkj0012 小时前
java 和 C#操作数据库对比
java·数据库·c#
编程在手天下我有2 小时前
Redis 数据类型全览:特性、场景与操作实例
数据库·redis·数据结构与算法
左灯右行的爱情2 小时前
缓存并发更新的挑战
jvm·数据库·redis·后端·缓存
Qiuner3 小时前
软件设计师速通其一:计算机内部数据表示
服务器·数据库·信号处理
金桔数科3 小时前
在MySQL Shell里 重启MySQL 8.4实例
mysql
她和夏天一样热3 小时前
【Java面试题04】MySQL 篇
java·mysql·adb
曹天骄3 小时前
设计并实现一个基于 Java + Spring Boot + MySQL 的通用多租户权限系统
java·spring boot·mysql
文牧之4 小时前
PostgreSQL oracle_fdw 扩展解析
运维·数据库·postgresql