设为首页 收藏本站
查看: 1102|回复: 0

[经验分享] 浅谈MySQL主键

[复制链接]

尚未签到

发表于 2018-10-10 10:03:03 | 显示全部楼层 |阅读模式
  
  主键没有着明确的概念定义,其是索引的一种,并且是唯一性索引的一种,且必须定义为“PRIMARY KEY”,是只可意会不可言传的东西。下面让我用通俗,甚至有些低俗的语言为您简单介绍一下MySQL的主键。
  简单描述:
  主键不能重复,就像QQ的用户名,有N个叫“虫zi”的网友,可是他们的QQ号码是不一样的,也就是说真正标识一个QQ的身份是“QQ号码”。
  不过主键和QQ号不一样,因为一个表只能有一个主键,而一个人可以有多个QQ号,这也是为什么人们喜欢在虚拟世界里面互相忽悠,
  貌似扯的有点远了,接着来看我们的MySQL主键。
  声明主键的方法:

  •   您可以在创建表的时候就为表加上主键,如:
      CREATE TABLE tbl_name ([字段描述省略...], PRIMARY KEY(index_col_name));
  •   也可以更新表结构时为表加上主键,如:
      ALTER TABLE tbl_name ADD PRIMARY KEY (index_col_name,…);
  主键示例:
  主键被认为是NOT NULL和UNIQUE约束最好的结合。如果这些列没有被明确地定义为NOT NULL,MySQL会隐含地定义这些列。
  /*
  创建一个qq表,将qq_id设为主键,且没有对其进行NOT NULl约束
  */
  create table qq(
  qq_id int(10),
  nick_name varchar(255) not null,
  primary key (qq_id)
  )
  /*
  插入一条数据,将qq号设为10000(咱也幻想一下),昵称设为"simaopig"
  */
  INSERT INTO qq( qq_id, nick_name )
  VALUES (
  '10000', 'simaopig'
  );
  /*
  插入一条数据,qq号仍为10000,因为数据库内已经存在其10000这样的数据,
  而且最最主要的是其QQ号为主键,所以报错,信息如下
  #1062 - Duplicate entry '10000' for key 'PRIMARY'
  */
  INSERT INTO qq( qq_id, nick_name )
  VALUES (
  '10000', 'chongpig'
  )
  /*
  虽然没有将qq号字段设NOT NULL约束,可是因为其是主键,所以其不能为NULL
  #1048 - Column 'qq_id' cannot be null
  */
  INSERT INTO qq( qq_id, nick_name )
  VALUES (
  NULL , 'chongpig'
  )
  主键也是索引:
  刚才已经说了,主键其实也是索引,甚至在MySQL的术语里面“键”就等于“索引”,所以“外键”一定要先设为“索引”,这个咱们下篇日志再来讨论。所以主键也应该和索引一样,既可以作用于单独的字段,又可以作用于多个字段
  举个简的例子吧,我住3单元,501室,我叫小小子,那么只有3单元501室才能在本小区表里面唯一确定我家。因为2单元,501室住着的可能也是个小小子,所以只有两个字段才能唯一确定我,也就是说可以二者组合作为主键。组合的主键,每个列都会隐含定义NOT NULL约束,且其二者加在一起被定义了UNIQUE 惟一约束。
  例子不写自己想的了,书中举的例子更是恰当,那就是一个防火墙,由host和port组合确定一个防火墙。代码示例如下:
  /*
  创建防火墙表,将host 和port组合设为主键,注意我没有将port设NOT NULL约束
  */
  create table firewall(
  host varchar(11) not null,
  port smallint(4),
  access enum('deny', 'allow') not null,
  primary key (host,port)
  )
  /*
  插入一条新的记录,没有啥问题
  1 row(s) inserted.
  */
  INSERT INTO firewall (
  host ,
  port ,
  access
  )
  VALUES (
  '202.65.3.87', '21', 'deny'
  );
  /*
  插入失败,因为host 加port的主键值202.65.3.87-21已经存在了
  #1062 - Duplicate entry '202.65.3.87-21' for key 'PRIMARY'
  */
  INSERT INTO firewall (
  host ,
  port ,
  access
  )
  VALUES (
  '202.65.3.87', '21', 'allow'
  );
  /*
  没声明NOT NULl port也不能为NULL
  #1048 - Column 'port' cannot be null
  */
  INSERT INTO firewall( host, port, access )
  VALUES (
  '192.168.0.1', NULL , 'deny'
  )
  在这个示例中,host和port都可以重复,但是不能同时重复,因为其是组合主键。且二者都不能被插入NULL,因为其是主键。
  我们可以看一下phpmyadmin,看一下port字段的默认值为0,这和昨天我们讲的索引规则是一样的,NOT NULL并且给设了DEFAULT,因其是整型所以为0,如果其为字符串的话,默认值就是”
  转载至:http://blog.csdn.net/hellosijian/article/details/7430492


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-619832-1-1.html 上篇帖子: mysql事务处理的意义 下篇帖子: CentOS7安装MySQL5.6-12628531
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表