精华内容
下载资源
问答
  • 在一个表中的主键只能是一个字段
    千次阅读
    2021-02-01 22:39:35

    主键是非常不幸的符号,因为“初级”的内涵和与逻辑模型有关的潜意识联想。 因此我避免使用它。 相反,我指的是物理模型的代理键和逻辑模型的自然键。

    重要的是,每个实体的逻辑模型至少具有一组“业务属性”,其包括实体的密钥。 Boyce,Codd,Date等在关系模型中将这些称为候选键。 然后,当我们为这些实体构建表时,它们的候选键在这些表中成为自然键。 只有通过那些自然键,用户才能唯一地识别表中的行; 因为代理键应始终对用户隐藏。 这是因为代理键没有商业意义。

    然而,在没有代理键的情况下,我们的表的物理模型在许多情况下效率低下。 回想一下,非聚集索引的非覆盖列只能通过密钥查找(通常)找到聚簇索引(忽略作为堆积实现的表)。 当我们的可用自然密钥很宽时,这(1)扩大了我们的非聚簇叶节点的宽度,增加了存储要求,并且对非聚集索引的搜索和扫描进行了读取访问; (2)减少聚集索引的扇出,增加索引高度和索引大小,再次增加聚簇索引的读取和存储要求; (3)增加了我们的聚簇索引的缓存要求。 从缓存中追逐其他索引和数据。

    这是一个小的代理键,被指定为RDBMS作为“主键”证明是有益的。 当设置为聚类键时,为了用于从非聚集索引和相关表中的外键查找中查找聚簇索引的键,所有这些缺点都消失了。 我们的聚簇索引扇出再次增加以减少聚簇索引的高度和大小,减少聚簇索引的缓存负载,减少通过任何机制访问数据时的读取(无论是索引扫描,索引搜索,非聚簇键查找还是外键查找) 并降低表的聚簇索引和非聚簇索引的存储要求。

    请注意,仅当代理键很小且聚类键时才会发生这些好处。 如果GUID用作聚类键,则情况通常比使用最小可用自然键时更糟。 如果表被组织为堆,则8字节(堆)RowID将用于键查找,这比16字节GU

    更多相关内容
  • CREATE TABLE orderitems ( order_num int(11) NOT NULL, order_item int(11) NOT NULL, prod_id char(10) NOT NULL, quantity int(11) NOT NULL, item_price decimal(8,2) NOT NULL, PRIMARY KEY (order_num,orde.....

    在这里插入图片描述

    在这里插入图片描述

    CREATE TABLE orderitems (
    order_num int(11) NOT NULL,
    order_item int(11) NOT NULL,
    prod_id char(10) NOT NULL,
    quantity int(11) NOT NULL,
    item_price decimal(8,2) NOT NULL,
    PRIMARY KEY (order_num,order_item),
    KEY FK_OrderItems_Products (prod_id),
    CONSTRAINT FK_OrderItems_Orders FOREIGN KEY (order_num) REFERENCES orders (order_num),
    CONSTRAINT FK_OrderItems_Products FOREIGN KEY (prod_id) REFERENCES products (prod_id)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    在这里插入图片描述

    展开全文
  • 数据库的单个数据表中只能一个主键。数据库主键,指的是一个列或多列的组合,其值能唯一地标识表中的每一行,通过它可强制的实体完整性;主键主要是用与其他的外键关联,以及本记录的修改与删除。数据库的单个...

    数据库的单个数据表中只能有一个主键。数据库主键,指的是一个列或多列的组合,其值能唯一地标识表中的每一行,通过它可强制表的实体完整性;主键主要是用与其他表的外键关联,以及本记录的修改与删除。

    4de34d12abcfac82c43c135eac5ca543.png

    数据库的单个数据表中只能有一个主键。

    数据库主键,指的是一个列或多列的组合,其值能唯一地标识表中的每一行,通过它可强制表的实体完整性。主键主要是用与其他表的外键关联,以及本记录的修改与删除。

    1、数据库的每张表只能有一个主键,不可能有多个主键。

    2、所谓的一张表多个主键,我们称之为联合主键。

    注:联合主键:就是用多个字段一起作为一张表的主键。

    3、主键的主键的作用是保证数据的唯一性和完整性,同时通过主键检索表能够增加检索速度。

    下面聊聊怎么创建联合主键:

    1、GUI中同时选中多列,点击设置为主键。

    2、sql语句将多列设置为主键:

    一种是在建表时就写出,语句如下:Create Table 表名 (字段名1 Int Not Null,

    字段名2 nvarchar(13) Not Null Primary Key (字段名1, 字段名2),

    字段名3…………

    字段名N………… )

    另一种是在建表后更改,语句如下:ALTER TABLE 表名 WITH NOCHECK ADD

    CONSTRAINT [PK_表名] PRIMARY KEY NONCLUSTERED

    (

    [字段名1],

    [字段名2]

    )

    推荐教程:《sql视频教程》

    展开全文
  • mysql已有主键表中新增自增长字段

    千次阅读 热门讨论 2019-09-08 21:11:32
    如标题所示,给数据加自增长字段是很简单的事情,但是如果这个表已经有主键,并且存在数据的情况下,怎么给数据加自增长主键呢?下面咱们来详细说一下这东东。 1、目标需求: (1)数据没有id字段,但是有...

    一、前言

          如标题所示,给数据表加自增长字段是很简单的事情,但是如果这个表已经有主键,并且存在数据的情况下,怎么给数据表加自增长主键呢?下面咱们来详细说一下这个东东。

    1、目标需求:

    (1)数据表没有id字段,但是有个char类型的字段作为主键使用。
    (2)表中没有其他自增长的字段
    (3)但是根据需求,需要重新加上id字段,新加的字段不用是主键,但是这个字段必须是自增长且是唯一字段。
    

    2、数据表结构如下:

    | redeem_code | CREATE TABLE `redeem_code` (
      `code` char(10) NOT NULL,
      `gift_id` int(10) unsigned NOT NULL DEFAULT '0',
      `user_id` bigint(20) unsigned NOT NULL DEFAULT '0',
      PRIMARY KEY (`code`) USING BTREE,
      KEY `idx_gift_id_user_id` (`gift_id`,`user_id`) USING BTREE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT   
    

    二、给数据表加上自增长且唯一索引字段(无数据)

    1、给数据表新增自增字段的前提

          但如果表中已经有了主键,我们要添加其他字段的属性为自增长,那么必须满足条:

    (1)这个字段是int类型
    (2)这个字段带有索引key,最好是unique,不过普通的key也是可以的
    (3)这个字段不能有默认值(因为默认字段是相同的,会影响到unique key的添加)
    

    2、给没有主键的表新增自增长字段

    如果表中没有主键也没有自增长的时候,可以一句话加上去:

    alter table redeem_code change id id int not null auto_increment primary key;
    

          但是如果表已经创建成功,并且设置完主键之后,那么这句话就不会有什么作用,反而会报错,报错信息大概是:数据表中不能存在多个主键。

    3、给已有主键的表新增自增长字段

          这边博主本来是想一句sql就完事的,但根据上面咱们查到的结果,新增的字段必须是有索引的,而索引和新增字段写在一个sql,目前博主只会一种写法,就是在新增字段的时候添加unique key,其他的写法还不知道。因此这边是分句执行的,结果如下:

    alter table redeem_code add id int(10) not Null;   //不要设置default 0,会报错:Invalid default value for ‘id’
    alter table redeem_code add unique idx_id(`id`);   //设置唯一索引,方便加自增长属性
    alter table redeem_code modify column id int(10) not null AUTO_INCREMENT;  //这句执行成功
    

    4、关于重新更改字段的属性问题

          细心的同学应该注意到了,上面最后设置自增长属性的时候,博主对字段的其他属性进行了重新定义,这是为什么呢?

    注意:alter table redeem_code modify column id AUTO_INCREMENT;   //直接执行这句会报错
    

          直接设置id字段的类型为自增长,mysql会报错,具体的报错信息忘记保存了,不过在博主的不断尝试下,发现重新定义字段属性的时候,是可以设置自增长的。

    推测原因:
          推测是因为对于字段加自增长的时候,对于mysql的表结构是有影响的。我们都知道一个数据表中只能有一个自增长列,虽然这个表中有主键code,但这个code是个随机值,mysql每次存储数据,并不会顺序写入数据页,而是随机写入,然后还要不断的移动表数据,适应插入的LRU算法,从而造成性能的浪费。但是如果这个时候,表中有自增长的字段,猜测mysql是会依据这个字段和主键共同进行数据的定位的,所以原来这个字段的属性结构要重新定义,并且也务必要保证自增长的字段是Int类型的。(PS:如果大佬们有更权威的说法,欢迎一起讨论!

    5、查看数据库结构

    ------------------------------------------------------------------------------------+
    | redeem_code | CREATE TABLE `redeem_code` (
      `code` char(10) NOT NULL,
      `gift_id` int(10) unsigned NOT NULL DEFAULT '0',
      `user_id` bigint(20) unsigned NOT NULL DEFAULT '0',
      `id` int(10) NOT NULL AUTO_INCREMENT,
      PRIMARY KEY (`code`) USING BTREE,
      UNIQUE KEY `idx_id` (`id`),
      KEY `idx_gift_id_user_id` (`gift_id`,`user_id`) USING BTREE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT 
    

          OK,这里看到我们已经成功设置新字段id为自增长且是unique key的了。但是设置成功的前提是这个表中没有其他数据。下面我们试一下当有数据的情况下,怎么设置自增长字段。

    三、给数据表加上自增长且唯一索引字段(有数据)

    1、表中新增3行数据,并按照上面方法进行设置

    +---------+---------+---------+----+
    | code    | gift_id | user_id | id |
    +---------+---------+---------+----+
    | 111111  |      11 |     111 |  0 |
    | 2222222 |      22 |     222 |  0 |
    | 333333  |      33 |     333 |  0 |
    +---------+---------+---------+----+
    

          执行到添加unique KEY的时候就报错了,因为是Int类型,而且在我们没有设置默认值的情况下,默认加进去的id都是0,所以重复了,不符合添加unique key的条件。

    2、试试varchar类型字段

    (1)先varchar()类型,后续改为int类型:

    alter table redeem_code add id varchar(10) not Null default '1'; 
    alter table redeem_code add unique idx_id(`id`);  //Duplicate entry '' for key 'idx_id'  
    	还是不行,毕竟多条数据的这个字段的值是相同的。试试普通的index试试
    

    (2)改为普通的key

    alter table redeem_code add id varchar(10) not Null default '1'; 
    alter table redeem_code add index idx_id(`id`);   //普通的key是可以的
     alter table redeem_code modify column id int(10) not null AUTO_INCREMENT;   //成功了,
    

    (3)查看表结构

    | redeem_code | CREATE TABLE `redeem_code` (
      `code` char(10) NOT NULL,
      `gift_id` int(10) unsigned NOT NULL DEFAULT '0',
      `user_id` bigint(20) unsigned NOT NULL DEFAULT '0',
      `id` int(10) NOT NULL AUTO_INCREMENT,
      PRIMARY KEY (`code`) USING BTREE,
      KEY `idx_gift_id_user_id` (`gift_id`,`user_id`) USING BTREE,
      KEY `idx_id` (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT |
    

    主要就是key的类型变了,代表普通的key还是可以的。

    3、使用默认的索引设置

    alter table redeem_code add id varchar(10) not Null default '1';
    alter table redeem_code change id id int(10) not null auto_increment key;     
    

    报错: Multiple primary key defined //如果不用unique key的话,默认是选用pramary key,所以就主键重复了。

    四、其他问题

    1、使用尽可能简洁的sql

    (1)一句sql试试

    alter table redeem_code change  id int(10) not null auto_increment  key;
    

    报错: Unknown column ‘id’ in ‘redeem_code’
    原因:缺少id字段导致的,下面加上id字段就好了。

    (2)两句sql试试

    alter table redeem_code add id varchar(10) not Null default '1'; 
    alter table redeem_code change id id int(10) not null auto_increment unique key;
    

    答案是可以的。。,就是不能放在一句执行完了,必须要分开两句

    2、设置之后,所有表的autoincrememt都是从下一条记录开始增长的。

          这个问题在网上查了挺久的,如果表中无数据或者数据不是很重要(量少)的话,可以先导出来,然后重新插入生成自增长的值。但如果数据量很大怎么办呢?

    个人觉得可行的方案:

    (1) 自动脚本程序,通过程序依次为数据表插入自增的值,但为了防止影响业务,最好是选择夜深人静数据库压力小的时候,可以考虑主从,先更新主库,业务放在从库上。

    (2) 如果想让原来的自动增长就得复制现有表的结构(无id),添加id并加上AUTO_INCREMENT,然后通过循环,添加n条空记录,然后对应先前表的id,依次插入数据。如果跟其他表有关联就比较麻烦了

    3、如果表中有数据,设置自增长和unique怎么办

          其实从上面的测试来看,我们发现在有数据的情况下,分步设置自增长和unique是会报错的,因为在设置新字段的时候,会给每行数据都加一个默认的值,而这些默认值是相同的,所以设置unique key的时候就会报错。

    建议方案:

    (1)先设置自增长和普通的key
    (2)使用程序把新增字段的值都按照顺序添加进去
    (3)当字段的值各不相同的时候,再修改为unique key
    

          当然,这个方案看起来笨笨的,归根结底,还是因为不能把这些sql都总结到一句上去,如果有大佬看到这篇博客,那么请告知怎么一句话设置这个sql,谢谢了!

          完成功能很简单,但是想要弄明白点,就势必要付出时间去测试了。博主这边测试的也不够多,欢迎各位同僚前来探讨,哈哈。

    =========2019/9/9 11:07更新 ========

    2019/9/9 11:07更新:

    大佬的力量果然是惊人的,上午经过另一位大佬的指点,终于得到一条sql就实现了咱们的需求,如下:

    ALTER TABLE `redeem_code` ADD COLUMN `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT AFTER `user_id`,ADD UNIQUE INDEX `unq_id`(`id`);
    

    查看表结构:

    | redeem_code | CREATE TABLE `redeem_code` (
      `code` char(10) NOT NULL,
      `gift_id` int(10) unsigned NOT NULL DEFAULT '0',
      `user_id` bigint(20) unsigned NOT NULL DEFAULT '0',
      `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
      PRIMARY KEY (`code`) USING BTREE,
      UNIQUE KEY `unq_id` (`id`),
      KEY `idx_gift_id_user_id` (`gift_id`,`user_id`) USING BTREE
    ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT  
    

          经过测试,不管是有没有数据,都可以使用这条sql,直接就加进去了,更重要的是,加进去id字段之后,表中的id是会自己从1开始填充的,这样的话就解决了困境。表数据显示如下:

    +-------+---------+---------+----+
    | code  | gift_id | user_id | id |
    +-------+---------+---------+----+
    | 11111 |       0 |       0 |  1 |
    | 2222  |      22 |       1 |  2 |
    +-------+---------+---------+----+
    
    

          表中原来是有两条数据的,现在新增的id都是自增长的,完美解决了问题。这样比着咱们上面分开写sql不知道高明了多少,哈哈,学到了。本来觉得上面也没有必要存在了,但是毕竟是探索过程,还是留下吧。

    end

    展开全文
  • 外键必须是另一个表主键吗 ?

    千次阅读 2021-05-07 14:13:38
    比如学生表在设计的时候一般可以用学号作为主键,也可设计一个ID字段字段由数据库自动生成且唯一。那么对于班级,一个班级对应多个学生,这个时候对于班级和学生之间的外键就可以用学生的ID做外键。 如下所...
  • 一张可以有多少个主键

    千次阅读 2021-01-19 05:33:29
    转自:http://blog.csdn.net/for12/article/details/49300843今天共工作...1、数据库的每张表只能一个主键,不可能有多个主键。2、所谓的一张多个主键,我们称之为联合主键。注:联合主键:就是用多个字段一起...
  • 【简答题】1 、零件的成型原理可分为哪三类?各举几例子说明. 2 、机械加工方法有哪些?...【判断题】对从添加数据时,从的外键字段的值必须来自主表中相应的字段值。【多选题】下列选项,包含矛盾双...
  • 对于复合索引:Mysql从左到右的使用索引字段一个查询可以只使用索引的一部份,但只能是最左侧部分。例如索引是key index (a,b,c). 可以支持a | a,b| a,b,c 3种组合进行查找,但不支持 b,c进行查找 .当最左侧...
  • 数据库表中有多主键

    千次阅读 2021-12-09 15:30:09
    数据库表中的多个主键称为联合...sql 中一个表设置两个主键是 将两个字段联合起来设置为主键 一个表只能一个主键 1.只有id为主键时 2.id和name这2个列一起构成为联合主键时 甚至可以全部字段设置为主键 ...
  • SQLSERVER,ORACLE都可以设定多个字段合并为主键。 USE [test] GO /****** Object: Table [dbo].[test3] Script Date: 12/08/2012 14:19:29 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ...
  • 展开全部可以,这说明这两张主键相关联,只是那张是主(就是32313133353236313431303231363533e58685e5aeb931333433656133该主键作为从的外键),那张是从(该主键同时也是外键),需要自己定义好。...
  • PRIMARY KEY联合主键

    2020-12-14 09:32:40
    一个字段只能在联合主键字段表中出现一次 ④联合主键的最小化原则 即联合主键不能包含不必要的多余字段。当把联合主键的某一字段删除后,如果剩下的字段构成的主键仍然满足唯一性原则,那么这个联合主键是不正确...
  • 如何给一个数据库添加主键

    万次阅读 2020-12-03 09:46:06
    (一张有且只能一个主键主键具有唯一性。) CREATE TABLE tb ( id INT IDENTITY(1,1) PRIMARY KEY, name VARCHAR(20) ) 2.创建的时候所有字段后面使用primary key(主键字段列表)来创建主键(如果有多...
  • 关于数据库一张有几个主键

    千次阅读 2021-09-15 22:20:55
    关系型数据库,用户建表时,只能一个主键,不可能有多个主键的,但有时候我们碰到关系S和我们的关系C存在多对多的联系,关系数据库,多对多联系必须建立一个关系模式,而该模式的码是联系两端实体的码加上...
  • 展开全部主键只有一个,但是可以设置...数据库的每张表只能一个主键,不可能有多个主键。所谓的一张多个主键,我们称之为联合主键。联合主键就是用多个字段一起作为一张主键主键主键的作用是保证数据的...
  • 1、数据库的每张表只能一个主键,不可能有多个主键。 2、所谓的一张多个主键,我们称之为联合主键。  注:联合主键:就是用多个字段一起作为一张主键。 3、主键主键的作用是保证数据的唯一性和完整性...
  • 创建时报错: > 1118 - Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. In current row format, ...● InnoDB 最多只能有1000个字段字段长度加起来如果超过65535,MyS.
  • ·同一张表只能一个主键,但能有多个唯一约束; ·主键字段值不能为NULL,唯一约束字段值可以为NULL; ·主键字段可以做为其他的外键,唯一约束字段不可以做为其他的外键; ·SQLServer默认为主键字段创建聚集...
  • MySQL如何使非主键字段自增长

    千次阅读 2017-12-10 17:11:50
    由于要求用户注册时使用自己的学号作为自己的账号,所以MySQL数据库中只能将学号(user_id)这个字段设为主键,但是管理的用户的时候用学号的话显然不太方便,于是又增加了一个字段(user_num),并且设为自增长,...
  • 我们开发的过程,总感觉一张一个主键。但是事情往往没有我们想象的那么简单,一张其实也是可以有多个主键。 如上图所示,其实说多个主键也不对,可以说是复合主键。意思为 这2个字段都不是唯一的,2个...
  • Computer System Add comments 2010年5月6日更新: 只有真正懂得了这个道理的人, 才算真正理解了...数据库设计, 每一个表都应该有一个字段作为主键. 这个字段一般是自增整数字段, 或者某些数据库支持的自动
  • 一个数据库表只能一个主键,不允许两个主键。但是允许两个字段联合起来设置为主键,这叫联合主键。创建主键的方式如下:12ALTER TABLE 选课表 ADD CONSTRAINT pk_选课 PRIMARY KEY(学号);创建联合主键的...
  • 数据库主键、唯一约束和索引

    千次阅读 2021-11-23 17:31:46
    (1)一个表可以没有主键,而且最多只能一个主键。 (2)主键值必须唯一标识表中的每一行,且不能为 NULL,即同一个表中不可能存在两行数据有相同的主键值。 2、MySQL 的 唯一约束。  MySQL唯一约束...
  • mysql数据库外键、主键详解

    千次阅读 2021-01-18 18:41:25
    一、什么是主键、外键:关系型数据库的一条记录有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键比如学生(学号,姓名,性别,班级)其中每个学生的学号是唯一的,...
  • 记录一个hive遇到的很有意思的问题,首先我建了两张临时,最终要把两张关联起来的时候,发现:两张表中的关联字段都是唯一的,关联之后关联字段竟然不唯一了!关联方法用的left join。检验sql如下: SELECT ...
  • SQL的每一张都必须设有主键

    千次阅读 2021-01-28 06:59:10
    如果用户看到了一个表示多对多关系的连接表中的数据,并抱怨它没有什么用处,那就证明它的主键设计地很好。2)永远也不要更新主键。实际上,因为主键除了唯一地标识一行之外,再没有其他的用途了,所以也就没有理由去...
  • 一个表主键,是自增的,我想给的另一个字段设置主键,设置成自增从10000开始自增,网上找了好多资料都是设置主键的,没有其他字段的,想问下如何写?一个表只能一个 自增键(有索引即可一般设为唯一索引,不...
  • mysql如何添加主键

    千次阅读 2021-02-02 19:11:01
    主键(PRIMARY KEY)”的完整称呼是“主键约束”。...主键约束即定义一个主键来唯一确定表每一行数据的标识符。主键可以是表中的某一列或者多列的组合,其中由多列组合的主键称为复合主键主键应该...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 167,312
精华内容 66,924
热门标签
关键字:

在一个表中的主键只能是一个字段