Mysql的主键问题若干

前日,作死格式化了电脑硬盘,昨天花了一天的时间也没有找回存档的所有代码和笔记。果然是no zuo no die!

所幸我学的还算认真,应该能够重新写回来(如果我愿意的话),不过失去了这些,也让我下定了决心,重新复习巩固学过的PHP,mysql知识。

雄关大道真如铁,而今迈步从头越。我决定开个博客来记录学习经历,给自己立下个小目标吧,每周至少三篇博客,记录自己学习的问题以及心得。自学PHP三个月,实在是新手中的新手,如果博客中有错误的地方,欢迎予以批评纠正。靡不有初,鲜克有终,闲话少说,开始正文。

今日重新复习mysql,了解到了很多以前忽略的地方,以前写sql语句,就是不求甚解,写对了就行,从不管其他。就比如,建表的主键问题。
今天,就突然想到,主键的作用是什么?如果我不设置主键,会发生什么?等等

花了一定的时间,做了一些探讨。如下建立一个不设置主键的user表

create table user (
user_id int,
user_name varchar(20)
)engine = myisam charset = utf8;

插入数据

insert into user (user_id,user_name) value 
(1,'liming'),
(2,'wangwu'),
(3,'zhaosi'),
(4,'zhangsan');

当然插入很顺利,我也以为很顺利,直到我插入了一个重复的user_id,结果是这样的:

mysql> insert into user (user_id,user_name) value (1,'liucun');
Query OK, 1 row affected (0.00 sec)

成功插入……这显然是不能接受的,因为我设置user_id 的目的就是希望给每个用户设置一个唯一的id作为他的辨识。因为很多不同的用户可能使用相同的名字,这就像人的身份证一样,人的身份证号一样岂不是乱套了。

这样我明白了一点主键的作用,就是作为一种类似与身份证号的东西,它使数据唯一而方便我们辨识。我觉得它就是一种独特的索引(index 其实我对于索引也是迷迷糊糊的,明天来解决它),方便我们找到该数据。

说到这里,我又想到一个东西 unique key,unique也是约束数据唯一的条件,那么它和primary key 又有什么不同吗?

那么我再次建立了一个商品表(不包含unique)

create table goods (
goods_id int primary key ,
goods_name varchar(20),
goods_sn varchar(20)
)engine=myisam charset=utf8;
insert into goods (goods_id,goods_name,goods_sn) value 
(1,'meizu','gn00001'),
(2,'xiaomi','gn00002'),
(3,'huawei','gn00003'),
(4,'inpone','gn00004');

这样就建立了一个商品表,主键goods_id,此时再插入一个重复的goods_id,当然会报错。再建立一个订单表orders

create table orders (
    order_id int,
    user_name varchar(20)  ,
    PRIMARY KEY (`order_id`),
    UNIQUE KEY (`user_name`)
)engine=myisam charset=utf8;
insert into orders(order_id , user_name) value 
(1 , 'zhangsan'),
(2 , 'wangwu');

这样插入,显然是没有问题的,只有插入重复的数据时会产生错误

mysql> insert into orders(order_id , user_name) value
    -> (3 , 'wangwu');
ERROR 1062 (23000): Duplicate entry 'wangwu' for key 'user_name'

感觉上和primary key插入重复数据发生的错误是一样的

mysql> insert into orders(order_id , user_name) value
    -> (1 , 'wang');
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'

找了很长时间,没发现什么不同,这是不可能的啊,两个功能相同的关键字?所以,我找了度娘,果然找到了,早该找度娘的……
我用desc 命令看出了不同处之一

mysql> desc orders;
+-----------+-------------+------+-----+---------+-------+
| Field     | Type        | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| order_id  | int(11)     | NO   | PRI | 0       |       |
| user_name | varchar(20) | YES  | UNI | NULL    |       |
+-----------+-------------+------+-----+---------+-------+

显然,设定为primary key 的数据是不能为NULL的,而设定为unique key 的数据是可以的,这只是不同点之一,另一个是primary key唯一,在一个表中只能有一个,而unique key 不是,它可以有多个。

mysql> create table orders (
    ->     order_id int,
    ->     user_name varchar(20) ,
    ->     goods_name varchar(20),
    ->     amount float(6,2),
    ->     PRIMARY KEY (`order_id`),
    ->     UNIQUE KEY (`user_name`,`goods_name`)
    -> )engine=myisam charset=utf8;
Query OK, 0 rows affected (0.01 sec)

这就像我上文所说的primary key就像一个身份证,每个人有且唯一且只能有一个,而unique key 就像QQ号,你的QQ号唯一,但你能拥有多个QQ号。
PS:在测试过程中我发现,这么设置并不会产生错误,但是这种情况百度了一下,叫做多个字段为主键……

create table orders (
    order_id int,
    user_name varchar(20) ,
    goods_name varchar(20),
    amount float(6,2),
    PRIMARY KEY (`order_id`,`user_name`)
)engine=myisam charset=utf8;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL一个关系型数据库管理系统,它使用表来存储和组织数据。每个表由一系列行和列组成,每行表示一个记录,每列表示记录的属性。 在MySQL中,数据结构主要包括以下几个方面: 1. 数据库(Database):MySQL中的数据以数据库的形式进行组织和管理。一个数据库可以包含多个表。 2. 表(Table):表是MySQL中最基本的数据组织单位。每个表由若干行和列组成,行表示记录,列表示记录的属性。 3. 列(Column):表中的每个字段被称为列。列定义了字段的名称和数据类型,例如整数、字符、日期等。 4. 行(Row):表中的每条记录被称为行。每行包含了一条完整的数据记录,其中每个字段对应一列。 5. 主键(Primary Key):主键是一列或一组列,用于唯一标识表中的每条记录。主键保证了表中的记录唯一性,并且可以用于建立表之间的关系。 6. 外键(Foreign Key):外键是一列或一组列,用于建立表与表之间的关系。外键引用了其他表的主键,从而实现了表之间的关联。 7. 索引(Index):索引是对表中一列或多列的值进行排序的数据结构。索引可以提高查询的速度,加快数据的检索。 8. 视图(View):视图是一个虚拟表,它是基于一个或多个表的查询结果。视图可以简化复杂的查询操作,并提供了数据的安全性和灵活性。 以上是MySQL中常用的数据结构,它们相互配合使用,可以有效地组织和管理数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值