精华内容
下载资源
问答
  • 1.创建主键语法 ALTER TABLE table_name ADD CONSTRAINT pk_name PRIMARY KEY(列名); 2.创建外键语法 ALTER TABLE news_info[子表名] ADD CONSTRAINT FK_news_info_news_type[约束名] FOREIGN KEY (info_id)[子表列]...
  • mysql复合主键

    千次阅读 2018-12-19 15:51:00
    上面的id和name字段组合起来就是w_test表的复合主键,目的是可能生产环境中有可能产生id重复的情况,为了确保唯一性使用复合索引 转载于:https://my.oschina.net/lianglc/blog/2990514

    表:

    CREATE TABLE `w_test` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(255) NOT NULL,
      PRIMARY KEY (`id`,`name`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

     

    实践:

    1、添加id可以重复

    1a70f06d043656025c5c4f4bd3169146ecb.jpg

    2、不能添加id和name都重复的数据

    3d513ddc253a0a154550a1c228a13167870.jpg

     

    结论:

    上面的id和name字段组合起来就是w_test表的复合主键,目的是可能生产环境中有可能产生id重复的情况,为了确保唯一性使用复合索引

    转载于:https://my.oschina.net/lianglc/blog/2990514

    展开全文
  • MYSQL复合主键表的创建

    千次阅读 2020-04-02 18:08:01
    类似服务器XX区创建角色编号 CREATE TABLE testDoubleKey ( area int(5) NOT NULL, id int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (area,id) ) ENGINE=MYISAM DEFAULT CHARSET=utf...复合主键引擎必须是MYISAM ...

    类似服务器XX区创建角色编号
    CREATE TABLE testDoubleKey (
    area int(5) NOT NULL,
    id int(11) NOT NULL AUTO_INCREMENT,
    PRIMARY KEY (area,id)
    ) ENGINE=MYISAM DEFAULT CHARSET=utf8;

    复合主键引擎必须是MYISAM

    展开全文
  • MySQL 复合主键(Day02)

    万次阅读 2018-10-15 17:21:49
    主键约束是表中的某一列,也可以是表中多个列所构成的一个组合,其中有多一个列组合而成的主键称为复合主键 在MsSQL中,主键列必须遵循以下规则: 1.每个表只能定义一个主键 2.唯一性原则,主键的值也成只为键值,...

    主键约束

    主键约束是表中的某一列,也可以是表中多个列所构成的一个组合,其中有多一个列组合而成的主键称为复合主键

    在MsSQL中,主键列必须遵循以下规则:

    1.每个表只能定义一个主键

    2.唯一性原则,主键的值也成只为键值,必须能够唯一标识表中的每一条记录,且不能为NULL,也就是说一张表中两个不同的行

    在主键上不能有相同的值。

    3.最小化规则.复合主键不能包含不必要的多余列,也就是说,当从一个复合主键中删除一列后,如果剩下的列构成的主键仍能够满足唯一性原则,那么这个复合主键是不正确的。

    4.一个列明在符合主键中只能出现一次。

     

    有多一个列组合而成的主键称为复合主键

    复合主键

    什么是主键约束:(在一个数据表中通过多个字段作为主键来确定一条记录,那么,多个字段组成的就是复合主键 )

    -------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    (下文摘选自-作者:beautifulsarah ,应博主要求,转载请注明出处
    来源:CSDN 
    原文:https://blog.csdn.net/beautifulsarah/article/details/53502109?utm_source=copy )

    所谓的复合主键 就是指你表的主键含有一个以上的字段组成 
    比如 
    create table test 

       name varchar(19), 
       id number, 
       value varchar(10), 
       primary key (name,id) 
    )

    上面的name和id字段组合起来就是你test表的复合主键 
    它的出现是因为你的name字段可能会出现重名,所以要加上ID字段这样就可以保证你记录的唯一性 
    一般情况下,主键的字段长度和字段数目要越少越好
    --------------------- 

    为什么要使用主键约束:

    (以下内容摘选自-作者:南极娃娃鱼 )应博主要求,转载请注明出处

    -------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    来源:CSDN 
    原文:https://blog.csdn.net/wangyuchun_799/article/details/49329649?utm_source=copy 
    版权声明:本文为博主原创文章,转载请附上博文链接!

    最近学习一点数据库的基本知识,被一个问题困惑了许久:主键是唯一的索引,那么为何一个表可以创建多个主键呢?

    其实“主键是唯一的索引”这话有点歧义的。举个例子,我们在表中创建了一个ID字段,自动增长,并设为主键,这个是没有问题的,因为“主键是唯一的索引”,ID自动增长保证了唯一性,所以可以。

    此时,我们再创建一个字段name,类型为varchar,也设置为主键,你会发现,在表的多行中你是可以填写相同的name值的,这岂不是有违“主键是唯一的索引”这句话么?

    所以我才说“主键是唯一的索引”是有歧义的。应该是“当表中只有一个主键时,它是唯一的索引;当表中有多个主键时,称为复合主键,复合主键联合保证唯一索引”。

    为什么自增长ID已经可以作为唯一标识的主键,为啥还需要复合主键呢。因为,并不是所有的表都要有ID这个字段啊哈哈,比如,我们建一个学生表,没有唯一能标识学生的ID,怎么办呢,学生的名字、年龄、班级都可能重复,无法使用单个字段来唯一标识,这时,我们可以将多个字段设置为主键,形成复合主键,这多个字段联合标识唯一性,其中,某几个主键字段值出现重复是没有问题的,只要不是有多条记录的所有主键值完全一样,就不算重复。
    --------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------

    创建主键约束有两种方法:

    1.create table tb_user(

    id int auto_increment primary key,

    user varchar (30)  not null,

    createtime daretime);

    方法二:

    create table tb_student(

    id int auto_increment,

    name varchar(30) not null,

    sex varchar(2),

    classid int not null,

    birthday date,

    PRIMARY KEY(id,classid)

    );

    如果表中仅由表中的某一列所构成,那么以上两种方法均可定义主键约束,如果主键有表中多个列所构成,那么只能用第二种方法来定义主键约束,另外,定义主键约束后,MySQL会自动为主键创建一个唯一索引,默认名为primary,也可以修改其他的名字。

    展开全文
  • Mysql复合主键,每个主键字段都能使用索引吗?可重复插入吗? 文章目录【Mysql复合主键,每个主键字段都能使用索引吗?可重复插入吗?一、主键1.1 创建主键1.2 删除主键二、复合主键2.1 Question2.2 实验环境...

    【MySQL】复合主键每个主键字段都能使用索引吗?可重复插入吗?


    一、主键

      primary key用来唯一约束该字段里面的数据。其主要特征有:

      ● 不能重复,不能为空

      ● 一张表中最多只有一个primary key

      ● primary key 所在列通常是整数类型


    1.1 创建主键

      create table [表名] ([字段1] [字段类型1] primary key,[字段2] [字段类型2], …);

      create table [表名] ([字段1] [字段类型1],[字段2] [字段类型2], … ,primary key(字段));

      alter table [表名] add primary key(字段);


    1.2 删除主键

      alter table [表名] drop primary key;


    二、复合主键

      在创建表的时候,在所有字段之后,使用primary key(字段)来创建主键,如果有多个字段作为主键,可以使用符合主键。

    MariaDB [class_info]> create table test(
    		id int unsigned,course char(10) comment '课程代码',
    		score int unsigned default 60 comment '成绩',
    		primary key(id,course));
    Query OK, 0 rows affected (0.01 sec)
    
    MariaDB [class_info]> show create table test\G
    *************************** 1. row ***************************
           Table: test
    Create Table: CREATE TABLE `test` (
      `id` int(10) unsigned NOT NULL DEFAULT '0',
      `course` char(10) NOT NULL DEFAULT '' COMMENT '课程代码',
      `score` int(10) unsigned DEFAULT '60' COMMENT '成绩',
      PRIMARY KEY (`id`,`course`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8
    1 row in set (0.00 sec)
    
    MariaDB [class_info]> desc test;
    +--------+------------------+------+-----+---------+-------+
    | Field  | Type             | Null | Key | Default | Extra |
    +--------+------------------+------+-----+---------+-------+
    | id     | int(10) unsigned | NO   | PRI | 0       |       |
    | course | char(10)         | NO   | PRI |         |       |
    | score  | int(10) unsigned | YES  |     | 60      |       |
    +--------+------------------+------+-----+---------+-------+
    3 rows in set (0.00 sec)
    

    2.1 Question

      那么问题来了,在主键中说过“ 一张表中最多只有一个primary key”,那么复合主键,每个主键字段都能使用索引吗?

      防止以后在应用环境中不当的使用索引,使得mysql性能下降,今天来验证一下这个问题。


    2.2 实验环境

    • MySQL 5.5
    • InnoDB引擎

    2.3 实验验证

      (1) 创建test1表和test2表

    MariaDB [class_info]> CREATE TABLE `test1` (
           `id` INT(11) NOT NULL,
           `name` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8_bin',
           `age` INT(11) NOT NULL,
           `gender` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8_bin',
           PRIMARY KEY (`id`, `age`)
           )
           COLLATE='utf8_bin'
           ENGINE=InnoDB;
    Query OK, 0 rows affected (0.03 sec)
    
    MariaDB [class_info]> desc test1;
    +--------+-------------+------+-----+---------+-------+
    | Field  | Type        | Null | Key | Default | Extra |
    +--------+-------------+------+-----+---------+-------+
    | id     | int(11)     | NO   | PRI | NULL    |       |
    | name   | varchar(50) | YES  |     | NULL    |       |
    | age    | int(11)     | NO   | PRI | NULL    |       |
    | gender | varchar(50) | YES  |     | NULL    |       |
    +--------+-------------+------+-----+---------+-------+
    4 rows in set (0.00 sec)
    
    MariaDB [class_info]> CREATE TABLE `test2` (
           `id` INT(11) NOT NULL,
           `name` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8_bin',
           `age` INT(11) NOT NULL,
           `gender` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8_bin',
           PRIMARY KEY (`age`, `id`)
           )
           COLLATE='utf8_bin'
           ENGINE=InnoDB;
    Query OK, 0 rows affected (0.02 sec)
    
    MariaDB [class_info]> desc test2;
    +--------+-------------+------+-----+---------+-------+
    | Field  | Type        | Null | Key | Default | Extra |
    +--------+-------------+------+-----+---------+-------+
    | id     | int(11)     | NO   | PRI | NULL    |       |
    | name   | varchar(50) | YES  |     | NULL    |       |
    | age    | int(11)     | NO   | PRI | NULL    |       |
    | gender | varchar(50) | YES  |     | NULL    |       |
    +--------+-------------+------+-----+---------+-------+
    4 rows in set (0.00 sec)
    

      可以看出 test1 和 test2 两个表的字段顺序是一样的,都是用了 id 和 age 的复合主键,不同的是 test1 使用的复合主键的顺序是 (id,age),test2 使用的复合主键的顺序是 (age,id)。

    (2) 使用索引

    image-20210422105017049

    image-20210422104930920
      推荐文章:【MySQL】explain 用法详解

      观察上面两张图,可知:对于test1表,使用id字段查询时使用到了主键索引,而使用age字段查询时未使用索引。对于test2表,使用age字段查询时使用到了主键索引,而使用id字段查询时未使用索引。


    2.4 实验结论

      由此证明,在MySQL中创建主键索引时字段的先后顺序是非常重要的。复合索引的第一位字段在查询时才可以用到索引,后面的字段在查询时都用不到索引。如果要频繁查询时,则应另外创建索引。

      那么对于上面的Question嘛,也就迎刃而解,这里的联合主键就是用多个字段一起作为一张表的主键,所以才说一张表中最多只有一个primary key。


    三、复合主键的唯一性

      (1) 虽然复合主键只有第一个字段在查询时才可以用到索引,但是这多个字段组成了唯一的组合,不能同时重复,不然在插入时就会报错。

    MariaDB [class_info]> select * from test1; 
    +----+--------+-----+--------+
    | id | name   | age | gender |
    +----+--------+-----+--------+
    |  1 | 李明   |  18 ||
    |  2 | 刘梅   |  17 ||
    +----+--------+-----+--------+
    2 rows in set (0.00 sec)
    
    MariaDB [class_info]> insert into test1 values(2,'路遥',19,'女');
    Query OK, 1 row affected (0.01 sec)
    
    MariaDB [class_info]> select * from test1;
    +----+--------+-----+--------+
    | id | name   | age | gender |
    +----+--------+-----+--------+
    |  1 | 李明   |  18 ||
    |  2 | 刘梅   |  17 ||
    |  2 | 路遥   |  19 ||
    +----+--------+-----+--------+
    3 rows in set (0.00 sec)
    
    MariaDB [class_info]> insert into test1 values(3,'马力',19,'男');
    Query OK, 1 row affected (0.00 sec)
    
    MariaDB [class_info]> select * from test1;
    +----+--------+-----+--------+
    | id | name   | age | gender |
    +----+--------+-----+--------+
    |  1 | 李明   |  18 ||
    |  2 | 刘梅   |  17 ||
    |  2 | 路遥   |  19 ||
    |  3 | 马力   |  19 ||
    +----+--------+-----+--------+
    4 rows in set (0.00 sec)
    
    MariaDB [class_info]> insert into test1 values(3,'宋江',19,'男');
    ERROR 1062 (23000): Duplicate entry '3-19' for key 'PRIMARY'
    

      test1将id和age连接起来作为复合主键,每一个字段时可以重复的,但是两个字段不能同时重复。多个字段的复合主键也是一样的,比如有A、B、C三个字段作为复合主键,当插入(1,1,1)时与前面的记录数据完全相同就会出错。

    ABC√ / ×
    111
    112
    121
    211
    122
    212
    221
    111×

      (2) 虽然复合主键只有第一个字段在查询时才可以用到索引,但是这多个字段组成了唯一的组合,不能为空,不然在插入时就会报错。

    MariaDB [class_info]> select * from test1;
    +----+--------+-----+--------+
    | id | name   | age | gender |
    +----+--------+-----+--------+
    |  1 | 李明   |  18 ||
    |  2 | 刘梅   |  17 ||
    +----+--------+-----+--------+
    2 rows in set (0.00 sec)
    
    MariaDB [class_info]> insert into test1(name,age,gender) values('张三',20,'男');
    ERROR 1364 (HY000): Field 'id' doesn't have a default value
    
    MariaDB [class_info]> insert into test1(id,name,gender) values(3,'李四','');
    ERROR 1364 (HY000): Field 'age' doesn't have a default value
    
    MariaDB [class_info]> insert into test1(name,gender) values('王麻子','男');
    ERROR 1364 (HY000): Field 'id' doesn't have a default value
    
    MariaDB [class_info]> desc test1;
    +--------+-------------+------+-----+---------+-------+
    | Field  | Type        | Null | Key | Default | Extra |
    +--------+-------------+------+-----+---------+-------+
    | id     | int(11)     | NO   | PRI | NULL    |       |
    | name   | varchar(50) | YES  |     | NULL    |       |
    | age    | int(11)     | NO   | PRI | NULL    |       |
    | gender | varchar(50) | YES  |     | NULL    |       |
    +--------+-------------+------+-----+---------+-------+
    4 rows in set (0.00 sec)
    

    展开全文
  • MySql复合主键与联合主键

    千次阅读 2019-10-22 17:44:00
    一、复合主键 复合主键:数据库表的主键由两个及以上的字段组成。 CREATE TABLE `asm_device_config_info` ( `asmModel` varchar(32) NOT NULL COMMENT '自助机型号', `deviceType` varchar(32) NOT NULL ...
  • 我的个人博客 百度搜索:【迷你酷吧】网址:https://www.minikuba.com,迷你酷吧是一个基于程序员经验为基础分享技术...复合主键 CREATE TABLE stu_detail( id INT NOT NULL AUTO_INCREMENT, age INT COMMENT '学生年龄
  • mysql 设置复合主键

    千次阅读 2019-01-18 09:49:49
    ALTER TABLE table_name ADD PRIMARY KEY(字段A,字段B,字段C);
  • mysql的联合主键与复合主键区别

    千次阅读 2018-10-30 15:53:50
    复合主键就是指你表的主键含有一个以上的字段组成 。 例如; create table test ( name varchar(19), id number, value varchar(10), primary key (id,name) ) 上面的id和name字段组合起来就是你test表的复合主键 ...
  • Mysql之primary主键 存储引擎(innodb):对于innodb存储引擎来说,一张表必须有一个主键。 1.单列主键 创建一个表: create table t17( id int primary key, name char(16) ) 往表内插入数据: insert into t17...
  • Mysql复合主键中自增长字段设置问题

    千次阅读 2017-01-13 16:02:05
    Google Analytics的ID一般形如:UA-18xxxxx-1,UA-18...有一段时间很 纠结这样的ID怎么去维护,直到最近查阅到Mysql手册才发现,原来Mysql原生就很好的支持了这种含自动增长字段的复合主键,所以字段2是存储引擎 自
  • MySQL创建复合主键

    千次阅读 2016-06-10 23:41:20
    该中间表没有主键,数据插入的时候,有时候由于网速比较慢,表单提交多点了几次,就插入了多条同样的数据。  解决的办法是,把这两个字段做成一个主键: ALTER TABLE t_test add PRIMARY KEY(origin_id,relation_...
  • mysql复合主键创建及删除

    万次阅读 2019-06-19 21:22:26
    摘要: mysql的联合主键:用2个字段(或者多个字段,后面具体都是用2个字段组合)来确定一条记录,说明,这2个字段都不是唯一的,2个字段可以分别重复,这么设置的好处,可以很直观的看到某个重复字段的记录条数。...
  • SELECT复合材料PRIMARY KEY的性能取决于许多因素。 如果您的表格是InnoDB,那么该表格将隐式聚合在PRIMARY KEY值上。 这意味着如果两个值都包含关键字,那么对两个值的搜索将会更快:不需要额外的密钥查找。 假设你...
  • https://blog.csdn.net/m0_37568814/article/details/82832616 https://www.cnblogs.com/tarena/p/3699161.html 什么是联合主键 https://zhidao.baidu.com/question/288631956.html
  • mysql只支持主键分区,优先测试按主键分区后,对列表查询基本没有起到优化效果,所以将记录产生时间和自增id加入设置成复合主键,然后再按时间进行分区处理。 #1.移除现有分区 alter table clue_call_record ...
  • mysql复合主键update的问题

    千次阅读 2017-02-25 17:27:13
    content_id和node_id是复合主键,执行插入命令: mysql> insert into content_node_relation(content_id,node_id,content_status) values('xiaohuangren','lab1412',1); mysql> insert into content_node_...
  • 2018-04-08删除主键并增加复合主键ALTER TABLE `table_name`DROP PRIMARY KEY,ADD PRIMARY KEY (`id`, `createTime`);今天发现一个简单比百度还快大方法,如果你忘记了或者不知道你的需求需要怎么sql 可以使用...
  • 这个可以有,需注意把自增长列放在复合主键的第一个位置,也就是最左边。比如:create table t(a int auto_increment,b int,key (a,b))这个问题分两种情况讨论。1、myisam引擎.复合索引可以包含一个auto_increment,...
  • 分析代码后发现有复合主键的update情况,更新复合主键表时只使用了一个字段更新,同时在事务内又有对该表的insert操作,结果出现了偶发的死锁问题。 比如表t_lock_test中有两个主键都为primary key(a,b) ,但是更新...
  • 关于mysql复合主键

    2019-10-08 18:30:19
    以前,只在资料中遇到过复合主键,只是知道如何构建复合主键,却从没切身用过,今天在使用lavarel的权限管理插件时,遇到了: CREATE TABLE `qpr_role_user` ( `user_id` int(10) unsigned NOT NULL, `role_id` int...
  • mysql设置复合主键方法

    万次阅读 2015-05-28 15:10:26
    mysql设置复合主键方法 alter table tb_name add primary key (字段1,字段2,字段3);
  • 复合主键为一个表中多个主键来确定数据的唯一性。 CREATE TABLE IF NOT EXISTS active_user( logindate DATE, uid VARCHAR(225), new_user INT, PRIMARY KEY(logindate,uid) ); ## 外键分开会报错 mysql> ...
  • MySQL如何创建主键,外键和复合主键

    千次阅读 2019-10-28 14:36:13
    1.主键语法 ①创建时:create table sc ( studentnoint, courseidint, scoreint, primary key (studentno) ); ②修改时:ALTER TABLE table_name ADD CONSTRAINT pk_name PRIMARY KEY(列名); 前提是原先没有...
  • 背景 今天在配合其他项目组做系统...分析代码后发现有复合主键的 update 情况,更新复合主键表时只使用了一个字段更新,同时在事务内又有对该表的 insert 操作,结果出现了偶发的死锁问题。 比如表t_lock_test中有...
  • 分区后,在表数据文件目录 C:\ProgramData\MySQL\MySQL Server 5.5\data 打开对应的数据库目录, 在此目录下回生成分区表,对应分区的.ibd 文件 linux下对应的分区文件 Myisam 存储引擎,它默认使用独立表...
  • 分析代码后发现有复合主键的update情况,更新复合主键表时只使用了一个字段更新,同时在事务内又有对该表的insert操作,结果出现了偶发的死锁问题。 比如表t_lock_test中有两个主键都为primary key(a,b),但是更新...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 31,726
精华内容 12,690
关键字:

mysql复合主键怎么写

mysql 订阅