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

1.主键

PRIMARY KEY 主键的使用

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

创建主键

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)

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)


-- 创建复合主键
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;

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


-- 在已有的表中添加主键
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 连用,字段值自增长

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.外键

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

-- 建表
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)


-- 查看建表语句
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)


-- 删除外键
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

-- 在已有表添加外键
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


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)


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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.L-OAM

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值