精华内容
下载资源
问答
  • 一张可以多少个主键

    万次阅读 多人点赞 2015-10-21 10:20:28
    1、数据库的每张只能有一个主键,不可能个主键。 2、所谓的一张个主键,我们称之为联合主键。  注:联合主键:就是用多字段一起作为一张主键。 3、主键主键的作用是保证数据的唯一性和完整性...

    今天在共工作,做老项目维护的时候无意中发现一张表居然有三个主键。吓死宝宝了,然后尝试着建表建主键,但是都不能成功。疑问

    难道是我写的有问题,最后通过查资料总终于解决了。

    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]
    )
     
    
    通过以上两种方式就解决了联合主键的问题。



    展开全文
  • 外键:是关联另外一个表主键一个键,保证两个表之间的关联性索引:加快搜索效率 为什么主键只有一个?因为主键起始从实现角度来看是一个 唯一 非空 聚类索引, 聚类索引在一个表只有一个,所以主键只有一个。...

    主键:保证数据完整唯一性。

    外键:是关联另外一个表主键的一个键,保证两个表之间的关联性

    索引:加快搜索效率

     

    为什么主键只有一个?

    因为主键起始从实现角度来看是一个   唯一 非空 聚类索引, 聚类索引在一个表中只有一个,所以主键只有一个。至于为什么聚类索引在一个表中只有一个是因为聚类索引表的数据物理顺序和索引排序方式一致,而物理存储方式只有一种,所以聚类索引在一个表中只有一种,详细情况请查看聚类索引。

     

    主键与索引的关系是什么?

    首先主键和索引从目的上来讲不是一个概念,主键是为了保证数据唯一性,索引是为了加快检索速度。但是,从实现方式上主键主键却达到了唯一 非空聚类索引的效果。所以

    1. 从实现目的来看(约束)

       主键约束=唯一非空 约束

    2. 从实现效果来看

       主键 = 唯一

     

    主键外键的关系?

     

       外键(Foreign Key)

      如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键。由此可见,外键表示了两个关系之间的联系。以另一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从表。外键又称作外关键字。

      外键的作用:

      保持数据一致性,完整性,主要目的是控制存储在外键表中的数据。 使两张表形成关联,外键只能引用外表中的列的值!

      例如:

      a b 两个表

      a表中存有客户号,客户名称

      b表中存有每个客户的订单

      有了外键后

      你只能在确信b 表中没有客户x的订单后,才可以在a表中删除客户x

      建立外键的前提: 本表的列必须与外键类型相同(外键必须是外表主键)。

      指定主键关键字: foreign key(列名)

      引用外键关键字: references <外键表名>(外键列名)

      事件触发限制: on delete和on update , 可设参数cascade(跟随外键改动), restrict(限制外表中的外键改动),set Null(设空值),set Default(设默认值),[默认]no action

      例如:

      outTable表 主键 id 类型 int

      创建含有外键的表:

      create table temp(

      id int,

      name char(20),

      foreign key(id) references outTable(id) on delete cascade on update cascade);

      说明:把id列 设为外键 参照外表outTable的id列 当外键的值删除 本表中对应的列筛除 当外键的值改变 本表中对应的列值改变。

      建键几个原则:

      1、 为关联字段创建外键。

      2、 所有的键都必须唯一。

      3、避免使用复合键。

      4、外键总是关联唯一的键字段。

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

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

    不一定是主键,但必须是唯一性索引。
    主键约束和唯一性约束都是唯一性索引。
    外键是表间关系的参照,可以不是主键。只是表明两个表之间的关系是通过那个属性连接起来的。

    比如学生表在设计的时候一般可以用学号作为主键,也可设计一个ID字段,字段由数据库自动生成且唯一。那么对于班级,一个班级对应多个学生,这个时候对于班级表和学生表之间的关系,班级表的外键学生ID对应于学生表的学生ID
    如下所示:
    学生(学号,学生ID, 姓名,班级号,成绩)
    班级(班级号,班级名,学生ID)

    展开全文
  • Computer System Add comments 2010年5月6日更新: 只有真正懂得了这道理的人, 才算真正理解了...在数据库设计中, 每一个表都应该有一个字段作为主键. 这字段一般是自增整数字段, 或者某些数据库支持的自动
      
     
    

    2010年5月6日更新: 只有真正懂得了这个道理的人, 才算真正理解了关系数据库. 如何才算懂得了这个道理? – 即使你有一百个理由要用关联主键, 你也能找到这唯一的一个理由放弃, 改而使用单一字段做主键.

    ——

    在数据库设计中, 每一个表都应该有一个字段作为主键. 这个字段一般是自增整数字段, 或者某些数据库支持的自动产生不重复字符串的字段, 也可以是程序自己产生的唯一标识. 总之, 每一个数据库表都应该有一个单一的字段作为主键.

    使用单一的字段作为表的主键, 有许多优点. 最重要的一条是可以通过一个原子属性(如整数, 字符串)来标识一行记录. 一旦可以方便地标识一行记录, 那么数据的查询, 更新, 删除也都非常简单.

    如果一个表没有主键, 那么必须通过一行记录本身才能标识一行记录. 也就是, 你必须知道一行记录的每一个字段的值, 才能在 SQL 语句中操作这条记录.

    数据库表支持联合主键, 也就是使用表的至少2个字段作为主键. 使用联合主键的缺点和不使用主键的缺点有很大的相似性, 因为当联合主键所使用的字段越多, 联合主键的缺点就越来越趋近于不使用主键, 直到表的所有字段作为主键时, 和不使用主键几乎是完全相同的 – 除了前者不能存在重复行,

    作为主键的字段一般使用自增整数字段, 因为绝大多数关系型数据库管理系统都支持这种字段类型, 而且速度快, 占用空间少. 一个害怕使用自增整数字段作为主键的理由是自增整数会回绕从而导致重复. 但这种担心是没有必要的. 对于最普通的32位无符号整数, 其最大值是在 Mysql 中是 4294967295(43亿) , 如果数据库表以每秒1条的速度保存记录, 那么一天也只能 86400 条(约10万条)记录, 需要 49710 天(约136年)之后才能发生重复. 幸运的是, 绝大多数系统产生数据的速度比这个假设慢得多了. 如果系统产生数据的速度确实足够快速, 则可以使用 64 位的长整型整数.

    如果确实需要联合主键, 则可以使用 UNIQUE 索引来代替. 任何不得不使用联合主键的需求, 都是基于对关系数据库的错误理解而产生的. 并不是要用"单一主键"来覆盖"复合主键"的需求, 而是"在表设计中, 单一主键是必须的, 用联合唯一索引来覆盖’复合主键’的需求".

    一个例子:

    表1: 使用联合主键(只是作为反面例子出现, 它应该被联合唯一索引代替)

    table_a{
        field_a: PK;
        field_b: PK;
        field_…: PK
        field_c;
    }

    表2: 不使用联合主键

    table_b{
        id: PK;
        field_a: UNIQUE;
        field_b: UNIQUE;
        field_…: UNIQUE
        field_c;
    }

    * 联合主键导致数据操作复杂化

    这两种表定义都能反映相同的业务模型. 使用联合主键对保存数据的程序代码影响不大, 情况1通过联合主键保证不会产生重复数据, 但情况2通过联合唯一索引保存不会产生重复数据. 但对查找操作有不良影响, 同时影响到使用了查找功能的更新和删除操作. 考虑查找特定几条记录的情况:

    表1: 查找 (field_a, filed_b, …) = [(1, 2, ...), (1, 3, ...), (2, 4, ...), ...] 这几条记录.
    表2: 查找 id = [1, 2, 3, ...] 这几条记录.

    显然, 表2的描述更简洁, 从而使程序代码和 SQL 语句更简洁. 如果把所有的字段都作为主键, 那么表1就不存在查找特定几条记录的功能了, "因为已经知道, 所以不必再找". 这是一种最极端的联合主键的副作用, 联合主键的字段越多, 就越趋向于这种极端.

    * 联合主键不利于表示"关系"

    联合主键不利于表示"关系", 是因为它会造成不必要的冗余. 考虑有另外两个表, 需要分别关联 table_a 和 table_b:

    table_ac{
        id;
        table_a_field_a;
        table_b_field_b;
        …
    }

    table_bc{
        id;
        table_b_id;
    }

    显然, 不使用联合主键可以减少冗余. 如果使用所有字段作为联合主键, 将变成把 table_a 的数据保存两份, 一份在 table_a, 另一份包含在 table_ac. 个人认为, 联合主键是是关系数据库理论一种概念, 在实际中如果使用是"反关系数据库模型"的, 实际使用应该用联合唯一索引替代.

    展开全文
  • 如何设置多个主键
  • 什么是一个表的外键 他和主键有什么区别吗/?主键:唯一标识中的所有行的一个列或组列。主键不允许空值。不能存在具有相同的主键值的两行,因此主键值总是唯一标识单个行。中可以不止一个键唯一标识...
  • 外键必须是另一个表主键

    万次阅读 多人点赞 2015-12-30 16:16:46
    不一定是主键,但必须是唯一性索引。 主键约束和唯一性约束都是唯一...外键 (FK) 是用于建立和加强两个表数据之间的链接的列或多列。当创建或修改时可通过定义 FOREIGN KEY 约束来创建外键。 在外键引用中,
  • 一个表的外键关联到主主键约束或者unique约束都可以,不一定非要主键约束追问:也就是意思是只要能唯一标识一张中数据,就可以做外键?追答:嗯,但是不能是数据上控制的,必须要约束之才行
  • 给已添加列,并且设置为主键一表个主键,说的正确点是,一个表只有一个主键,只不过它由两列组成一个主键
  • sql 关于一表个主键唯一性的约束

    万次阅读 2019-02-27 17:28:15
    1.对于一般的,我们只需设一个主键,防止重复,但是我们如果设置多个主键,是每个主键唯一性吗?还是多个主键组合起来具有唯一性 2.答案肯定是多个主键合起来具有唯一性,话说太多,现在上例子 3.例如,我建...
  • 在我们开发的过程中,总感觉一张一个主键。但是事情往往没有我们想象的那么简单,一张其实也是可以个主键。 如上图所示,其实说多个主键也不对,可以说是复合主键。意思为 这2字段都不是唯一的,2...
  • MySQL必须有主键吗?

    千次阅读 2020-11-04 19:06:27
    因为聚集索引决定了中数据的物理存储顺序,那么一个表有且只有一个聚集索引。一个聚集索引可以包含多列。好比一个电话本是基于名字,姓氏同时排序。 I nnodb选择一个聚集索引的过程 对于Innodb,主键
  • 分区表主键

    千次阅读 2017-03-31 16:43:48
    如题,现有分区,除主键索引外其余索引均为分区索引,疑问如下: 1、现在dba指出修改计划将表主键的全局索引修改为分区索引,不知道修改后能不能够起到优化的作用?? 2、分区索引对主键中的数据一致性...
  • 使用sqlalchemy获取到的结果只包含...以及如何获取某张表的主键呢? from sqlalchemy.ext.automap import automap_base from sqlalchemy.orm import sessionmaker from sqlalchemy import MetaData, inspect, creat...
  • 现在2个表部分学校和学校 其中部分学校在A库、学校在B库 SCH_ID为关联主键 部分学校 AUTO_ID USER_ID COTY_NO SCH_ID SCH_NO SCH_NAME 1 17 123 341289001 1 职业学院 学校 SCH_ID SCH_NO SCH_...
  • 主键

    2017-12-19 18:44:59
    在数据库设计时,主要就是对实体和关系的设计,实体表现出来就是,关系表现出来就是外键。...其实更准确的说法,每行数据的唯一标识是候选键(Candidate Key),一个表中可以很多候选键,主键
  • sqoop增量导入且表主键

    千次阅读 2016-10-18 20:14:48
    之前写过一个sqoop增量导入的文章http://blog.csdn.net/qq_20641565/article/details/52763663,自己控制增量导入,但是那个架构需要表有主键值,但是一般在实际中却没有主键只有增量字段而且数据量特别大,...
  • 主键一对一 就是两张主键相同的一一...两就是对应的关系,这就叫做数据关联,主键一对一的情况相当于一只有身份证,一一对应,不能多 但是主键一对一的情况要求主键相同,完全对应,但是主键又是唯一的
  • 情况:如果中间仅仅是做关联用的,它里面仅有2外键做联合主键,则使用ManyToMany(不用写中间的Model,只需要写出两张主的model即可) 学生 @Entity @Table(name = "T_STUDENT") @Sequence...
  • mappedBy和JoinColumn实质上指向的是同一个表即外键作为主键所在的对应的实体(其对应对象1) mappedBy对应实体的声明对象1 JoinColumn对应的是对象1的主键 比如: 花朵类{ 花朵类名 ...
  • sqlserver设置两及两以上主键

    万次阅读 2018-10-14 17:34:13
    首先要明确主键只有一个,但是我们可以设置主键组来设置主键。这样两列就都是主键了。设置方法: 利用图形界面操作 选中方法。按住shift,再点击你要选中的列就ok了。 利用SQL语句 alter table tablename ...
  • 在数据合并等操作中不可替代的优势但是由于普通的GUID的分散性使得如果主键加上聚集索引(Clustered Index)会导致在插入记录时效率大大降低SQL SERVER 2005中新增了一个NEWSEQUENTIALID的函数,MSDN的解释是:在...
  • 很多书上或网页都推荐针对hibernate的设计时,设计一个独立的主键id,跟业务逻辑无关系的。但是我在实际应用中,发现有些业务涉及主外时,使用跟业务逻辑有关的主键很方便。 问题补充:谢谢各位,这几天忙...
  • MySQL许多主键生成策略,其中很常见的种是自动生成。一般情况下,主键类型是BIGINT UNSIGNED,自动生成主键的关键词是AUTO_INCREMENT。主键的生成策略是生成器,这种策略不常见,一般用于遗留数据库使用JPA。...
  • 刚开始接接触MySQL, 好像说InnoDB的主键是按聚簇索引实现的,也就是说,只要有主键,则该就是一个按聚簇索引来组织的,(像Oracle的IOT那样),对么?
  • 公民和公民的身份证,是一个一的例子,一个公民只有一个身份证。 这是基于主键的,基于外键的映射在:http://blog.csdn.net/nthack5730/article/details/45336457 场景准备: 实体类:Person.java、...
  • MySql-聚集索引-为什么必须有主键

    千次阅读 2017-11-02 17:17:39
    前几天跟搞C++游戏服务器同事联动实现一个业务,看到他创建默认没有主键,于是我建议他添加,同事铮铮词说,业务根本用不着,多一个字段多浪费,我瞬间无语,于是跟他解说为什么必须添加?针对MySQL5.6版本中...
  • PostgreSQL数据库测试环境中多张表没有添加主键约束,只有一个serial的自增字段。现在需要把那些没有主键都加上,serial类型的字段为id 。 首先是怎么找到PostgreSQL数据库中哪些没有主键?我们看下pg_...
  • 只有这两张存在关系才可以使用内链接和外连接么?要求该的外键是另一张主键
  • Oracle中建表主键自增

    千次阅读 2014-09-22 20:56:19
    oracle建表设置主键自增  首先创建一张

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 232,776
精华内容 93,110
关键字:

一个表有且仅有一个主键