精华内容
下载资源
问答
  • I have table 1 with a primary key user_id and table 2 where user_id is a foreign key.Only 1 record per user_id can exist in table 2, and no record can exist without it.QUESTION: Can user_id in table 2...

    I have table 1 with a primary key user_id and table 2 where user_id is a foreign key.

    Only 1 record per user_id can exist in table 2, and no record can exist without it.

    QUESTION: Can user_id in table 2 be both foreign and primary key at the same time, and if yes, is it a good idea, what are pros/cons?

    解决方案

    Yes, you can do this (and you should, from a database design point of view).

    However, consider what it means if user_id is the primary key on table 2. You are in effect saying that each row in table 2 corresponds to a user, but you already have a table where each row corresponds to a user: table 1. This raises the question "why then don't you put all data of table 2 into nullable columns in table 1?". After all, having two tables means you will have to make two queries to get this data instead of one.

    Now there are some scenarios where this practice might be a good idea:

    if you have lots of users but only a few rows in table 2, perhaps the query on table 2 will be only performed rarely; at the same time, you gain storage space and modification speed on table 1

    it might be possible in the future for the primary key of table 2 to change, while the foreign key remains; if you put all the data in table 1, this modification would most likely break your database model

    It can be a good idea, but it depends on the particulars of your application.

    展开全文
  • 数据库主键外键联合主键 主键类型 所有数据库表必须具有一个主键列。 主键唯一地标识表中的一行,因此它受到以下约束的约束: 独特 非空 不可变的 选择主键时,我们必须考虑以下方面: 主键可用于通过...

    数据库主键外键联合主键

    主键类型

    所有数据库表必须具有一个主键列。 主键唯一地标识表中的一行,因此它受到以下约束的约束:

    • 独特
    • 非空
    • 不可变的

    选择主键时,我们必须考虑以下方面:

    • 主键可用于通过外键关系连接其他表
    • 主键通常具有关联的默认索引,因此数据类型越紧凑,索引将占用的空间越少
    • 一个简单的键比复合键的性能更好
    • 即使在高度并发的环境中,主键分配也必须确保唯一性

    选择主键生成器策略时,选项为:

    1. 自然键,使用保证单个行唯一性的列组合
    2. 替代键,独立于当前行数据生成

    自然键

    自然密钥的唯一性受外部因素(例如,人的唯一标识符,社会保险号,车辆识别号)的影响。

    自然键很方便,因为它们具有与外界等效的功能,并且不需要任何额外的数据库处理。 因此,即使在将实际行插入数据库之前,我们也可以知道主键,从而简化了批处理插入。

    如果自然键是单个数字值,则性能可与替代键的性能相媲美。

    对于复合键,我们必须意识到可能的性能损失:

    • 复合键联接比单键联接慢
    • 复合键索引比单键索引需要更多空间

    对于索引和连接,非数字键的效率低于数字键(整数,bigint)。 CHAR(17)自然密钥(例如,车辆识别号)占用17个字节,而不是4个字节(32位整数)或8个字节(64位bigint)。

    最初的模式设计唯一性假设可能不会永远成立。 假设我们使用了一个特定的国家/地区公民数字代码来标识所有应用程序用户。 如果现在我们需要支持其他没有此类公民数字代码或与现有条目冲突的国家,那么我们可以得出结论,架构的发展可能受到阻碍。

    如果自然键唯一性约束发生变化,将很难同时更新主键(如果我们仍然设法删除了主键约束)和所有关联的外键关系。

    代理键

    代理键是独立于当前行数据而生成的,因此其他列约束可以根据应用程序业务需求自由发展。

    数据库系统可以管理代理密钥的生成,并且密钥通常是数字类型(例如,整数或bigint),每当需要新密钥时就递增。

    如果我们想控制代理密钥的生成,我们可以使用128位GUIDUUID 。 由于不再需要额外的数据库密钥生成处理,因此简化了批处理并可以提高插入性能。 即使未广泛采用此策略,在设计数据库模型时也值得考虑

    当数据库标识符生成责任落在数据库系统上时,有几种策略可以自动增加代理键:

    数据库引擎 自动递增策略
    Oracle 序列
    微软SQL 身份 顺序
    PostgreSQL 序列串行类型
    MySQL 自动递增
    DB2 身份 顺序
    数据库 身份 顺序

    设计方面

    翻译自: https://www.javacodegeeks.com/2014/06/database-primary-key-flavors.html

    数据库主键外键联合主键

    展开全文
  • Does Postgres automatically put indexes on Foreign Keys and Primary Keys? Postgres会自动将索引放在外键主键上吗?

    本文翻译自:Postgres and Indexes on Foreign Keys and Primary Keys

    Does Postgres automatically put indexes on Foreign Keys and Primary Keys? Postgres会自动将索引放在外键和主键上吗? How can I tell? 我该怎么说? Is there a command that will return all indexes on a table? 是否有一个命令可以返回表上的所有索引?


    #1楼

    参考:https://stackoom.com/question/44UE/外键和主键的Postgres和索引


    #2楼

    This query will list missing indexes on foreign keys , original source . 此查询将列出外键原始源 上缺少的索引

    -- check for FKs where there is no matching index
    -- on the referencing side
    -- or a bad index
    
    WITH fk_actions ( code, action ) AS (
        VALUES ( 'a', 'error' ),
            ( 'r', 'restrict' ),
            ( 'c', 'cascade' ),
            ( 'n', 'set null' ),
            ( 'd', 'set default' )
    ),
    fk_list AS (
        SELECT pg_constraint.oid as fkoid, conrelid, confrelid as parentid,
            conname, relname, nspname,
            fk_actions_update.action as update_action,
            fk_actions_delete.action as delete_action,
            conkey as key_cols
        FROM pg_constraint
            JOIN pg_class ON conrelid = pg_class.oid
            JOIN pg_namespace ON pg_class.relnamespace = pg_namespace.oid
            JOIN fk_actions AS fk_actions_update ON confupdtype = fk_actions_update.code
            JOIN fk_actions AS fk_actions_delete ON confdeltype = fk_actions_delete.code
        WHERE contype = 'f'
    ),
    fk_attributes AS (
        SELECT fkoid, conrelid, attname, attnum
        FROM fk_list
            JOIN pg_attribute
                ON conrelid = attrelid
                AND attnum = ANY( key_cols )
        ORDER BY fkoid, attnum
    ),
    fk_cols_list AS (
        SELECT fkoid, array_agg(attname) as cols_list
        FROM fk_attributes
        GROUP BY fkoid
    ),
    index_list AS (
        SELECT indexrelid as indexid,
            pg_class.relname as indexname,
            indrelid,
            indkey,
            indpred is not null as has_predicate,
            pg_get_indexdef(indexrelid) as indexdef
        FROM pg_index
            JOIN pg_class ON indexrelid = pg_class.oid
        WHERE indisvalid
    ),
    fk_index_match AS (
        SELECT fk_list.*,
            indexid,
            indexname,
            indkey::int[] as indexatts,
            has_predicate,
            indexdef,
            array_length(key_cols, 1) as fk_colcount,
            array_length(indkey,1) as index_colcount,
            round(pg_relation_size(conrelid)/(1024^2)::numeric) as table_mb,
            cols_list
        FROM fk_list
            JOIN fk_cols_list USING (fkoid)
            LEFT OUTER JOIN index_list
                ON conrelid = indrelid
                AND (indkey::int2[])[0:(array_length(key_cols,1) -1)] @> key_cols
    
    ),
    fk_perfect_match AS (
        SELECT fkoid
        FROM fk_index_match
        WHERE (index_colcount - 1) <= fk_colcount
            AND NOT has_predicate
            AND indexdef LIKE '%USING btree%'
    ),
    fk_index_check AS (
        SELECT 'no index' as issue, *, 1 as issue_sort
        FROM fk_index_match
        WHERE indexid IS NULL
        UNION ALL
        SELECT 'questionable index' as issue, *, 2
        FROM fk_index_match
        WHERE indexid IS NOT NULL
            AND fkoid NOT IN (
                SELECT fkoid
                FROM fk_perfect_match)
    ),
    parent_table_stats AS (
        SELECT fkoid, tabstats.relname as parent_name,
            (n_tup_ins + n_tup_upd + n_tup_del + n_tup_hot_upd) as parent_writes,
            round(pg_relation_size(parentid)/(1024^2)::numeric) as parent_mb
        FROM pg_stat_user_tables AS tabstats
            JOIN fk_list
                ON relid = parentid
    ),
    fk_table_stats AS (
        SELECT fkoid,
            (n_tup_ins + n_tup_upd + n_tup_del + n_tup_hot_upd) as writes,
            seq_scan as table_scans
        FROM pg_stat_user_tables AS tabstats
            JOIN fk_list
                ON relid = conrelid
    )
    SELECT nspname as schema_name,
        relname as table_name,
        conname as fk_name,
        issue,
        table_mb,
        writes,
        table_scans,
        parent_name,
        parent_mb,
        parent_writes,
        cols_list,
        indexdef
    FROM fk_index_check
        JOIN parent_table_stats USING (fkoid)
        JOIN fk_table_stats USING (fkoid)
    WHERE table_mb > 9
        AND ( writes > 1000
            OR parent_writes > 1000
            OR parent_mb > 10 )
    ORDER BY issue_sort, table_mb DESC, table_name, fk_name;
    

    #3楼

    I love how this is explained in the article Cool performance features of EclipseLink 2.5 我喜欢在EclipseLink 2.5的Cool performance features文章中解释这一点

    Indexing Foreign Keys 索引外键

    The first feature is auto indexing of foreign keys. 第一个功能是自动索引外键。 Most people incorrectly assume that databases index foreign keys by default. 大多数人错误地认为数据库默认情况下索引外键。 Well, they don't. 好吧,他们没有。 Primary keys are auto indexed, but foreign keys are not. 主键是自动索引的,但外键不是。 This means any query based on the foreign key will be doing full table scans. 这意味着任何基于外键的查询都将进行全表扫描。 This is any OneToMany , ManyToMany or ElementCollection relationship, as well as many OneToOne relationships, and most queries on any relationship involving joins or object comparisons . 这是任何OneToManyManyToManyElementCollection关系,以及许多 OneToOne关系,以及涉及连接或对象比较的任何关系的大多数查询 This can be a major perform issue, and you should always index your foreign keys fields. 这可能是一个主要的执行问题,您应始终索引外键字段。


    #4楼

    PostgreSQL automatically creates indexes on primary keys and unique constraints, but not on the referencing side of foreign key relationships. PostgreSQL自动在主键和唯一约束上创建索引,但不在外键关系的引用端创建索引。

    When Pg creates an implicit index it will emit a NOTICE -level message that you can see in psql and/or the system logs, so you can see when it happens. 当Pg创建一个隐式索引时,它会发出一条NOTICE -level消息,你可以在psql和/或系统日志中看到它,这样你就可以看到它何时发生。 Automatically created indexes are visible in \\d output for a table, too. 自动创建的索引也在表的\\d输出中可见。

    The documentation on unique indexes says: 有关唯一索引文档说:

    PostgreSQL automatically creates an index for each unique constraint and primary key constraint to enforce uniqueness. PostgreSQL自动为每个唯一约束和主键约束创建索引以强制唯一性。 Thus, it is not necessary to create an index explicitly for primary key columns. 因此,没有必要为主键列显式创建索引。

    and the documentation on constraints says: 关于约束的文档说:

    Since a DELETE of a row from the referenced table or an UPDATE of a referenced column will require a scan of the referencing table for rows matching the old value, it is often a good idea to index the referencing columns. 由于引用表中的行的DELETE或引用列的UPDATE将需要扫描引用表以查找与旧值匹配的行,因此通常最好对引用列建立索引。 Because this is not always needed, and there are many choices available on how to index, declaration of a foreign key constraint does not automatically create an index on the referencing columns. 因为并不总是需要这个,并且有很多关于如何索引的选择,所以外键约束的声明不会自动在引用列上创建索引。

    Therefore you have to create indexes on foreign-keys yourself if you want them. 因此,如果需要,您必须自己在外键上创建索引。

    Note that if you use primary-foreign-keys, like 2 FK's as a PK in a M-to-N table, you will have an index on the PK and probably don't need to create any extra indexes. 请注意,如果您使用主外键,例如2 FK作为M-to-N表中的PK,您将拥有PK的索引,并且可能不需要创建任何额外的索引。

    While it's usually a good idea to create an index on (or including) your referencing-side foreign key columns, it isn't required. 虽然在引用端外键列上创建索引(或包括)通常是个好主意,但这不是必需的。 Each index you add slows DML operations down slightly, so you pay a performance cost on every INSERT , UPDATE or DELETE . 您添加的每个索引都会略微降低DML操作,因此您需要为每个INSERTUPDATEDELETE支付性能开销。 If the index is rarely used it may not be worth having. 如果很少使用该索引,则可能不值得拥有。


    #5楼

    Yes - for primary keys, no - for foreign keys (more in the docs ). 是 - 对于主键,否 - 对于外键(在文档中更多)。

    \d <table_name>
    

    in "psql" shows a description of a table including all its indexes. in “psql”显示包含其所有索引的表的描述。


    #6楼

    For a PRIMARY KEY , an index will be created with the following message: 对于PRIMARY KEY ,将使用以下消息创建索引:

    NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "index" for table "table" 
    

    For a FOREIGN KEY , the constraint will not be created if there is no index on the referenc ed table. 对于一个FOREIGN KEY ,约束也不会,如果有在和借鉴编辑表中没有索引创建。

    An index on referenc ing table is not required (though desired), and therefore will not be implicitly created. 上和借鉴ING表的索引不是必需的(尽管需要的话),并且因此将不被隐式地创建。

    展开全文
  • –删除外键 语法:alter table 表名 drop constraint 外键约束名 如: alter ...foreign key(列名) references 引用外键表(列名) 如: alter table Stu_PkFk_Sc add constraint Fk_s foreign key (sno) references Stu
  • hibernate整合遗留数据库之处理主键(外键引用主键)

     

    hibernate整合遗留数据库之处理主键(外键引用非主键)

     

    通常,外键约束引用主键。外键约束是一个完整性规则,它保证被引用的表有一行所包含的键值与引用表和给定行中的键值相匹配。

    遗留schema有时候会有不遵循简单的"外键引用主键"规则的外键约束。有时候外键引用非主键,一个简单的唯一列,一个自然的非主键。注意,被外键引用的非主键列必须用:unique="true"约束。

    hibernate映射中你会遇到property-ref属性,它用来告诉hibernate”这是具名属性的一个镜像" ,property-ref还要求目标属性是唯一的,所以被外键引用的非主键列必须用:unique="true"约束。

     


     

    pom.xml:

     

     

    resources/hibernate.cfg.xml:

     

     

    pojo/User.java:

     

     

    pojo/User.hbm.xml:

     

     

    pojo/Item.java:

     

     

    pojo/Item.hbm.xml:

     

     

    util/HibernateUtil.java:

     

     

    util/Manager.java:

     

     

    表结构:

     

     

    展开全文
  • 外键主键

    千次阅读 2011-05-17 13:27:00
    主键外键  一、什么是主键外键:关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键  比如  学生表(学号,姓名,...
  • SQL语句删除和添加外键主键

    千次阅读 2015-04-19 09:57:13
    SQL语句删除和添加外键主键  --删除外键 语法:alter table 表名 drop constraint 外键约束名  如:  alter table Stu_PkFk_Sc drop constraint FK_s  alter table Stu_PkFk_SC drop ...
  • mysql 外键主键,唯一性约束

    千次阅读 2017-06-21 15:32:57
    (1)mysql添加外键 ... table 表名 add constraint FK_ID foreign key(你的外键字段名) REFERENCES 外表表名(对应的表的主键字段名); 例: alter table tb_active add constraint FK_ID foreign key
  • --删除外键  语法:alter table 表名 drop constraint 外键约束名  如:alter table s_...语法:alter table 表名 add constraint 外键约束名 foreign key(列名) references 引用外键表(列名)  如:alter t
  • 这样的多个外键user-id在powerdesigner中应该如何添加外键? ps:user表:学校教务系统信息表 user-id:学校教务系统登录用户ID(学号sno或教师号tno) [img=...
  • 关于外键的操作 1.创建表时添加外键  Createtable message(  mId int,  mAddressvarchar(200),  mGendervarchar(2),  constraint [约束名称] f
  • --删除外键 语法:alter table 表名 drop constraint 外键约束名 如: alter table Stu_PkFk_Sc drop constraint FK_s alter table Stu_PkFk_SC drop constraint FK_c --添加外键 语法:alter table 表名 ...
  • 一对一双向外键关联这个一对一双向外键关联要怎么理解,双方都持有对方的引用,也就是你中有我,我中有你。 以前一篇的例子来说,学生方持有身份证类的引用,身份证类也持有一个学生对象的引用,这两个引用都充当...
  • I'm attempting to setup a foreign key in table cell_lines that will reference the topographic_region column of the composite primary key in table topographic_regions.Each time I run the last three lin...
  • 【关键字 】paimary key 【代表主键】,not null【 非空 】foreign key【 代表外键】 (zhu) references【引用】 zhu ( code)[ 建立外键关系 ]auto_increment【自动递增】注释语法:用#注释、创建表create table ...
  • 基于外键的双向一对一关系映射 表结构: 类Person和类IdCardpublic class Person { private int id; private String name; private int age; private IdCard idCard; //get…set } public class IdCard{ ...
  • http://blog.csdn.net/fhd001/article/details/5913278
  • 目录概述创建表时添加约束添加列级约束添加表级约束通用的写法主键和唯一的对比外键的特点修改表时添加约束语法示例修改表时删除约束 概述 含义:一种限制,用于限制表中的数据,为了保证表中数据的准确性和可靠性...
  • 最近用java写的数据库的表复制,用到了下面的一些查询语句,保存上免得以后忘记了 select username,default_tablespace from dba...select * from user_cons_columns cl where cl.constraint_name = '外键引用表的键名'
  • Oracle数据库ORA-02449表中的唯一/主键外键引用 问题 ORA-02449:表中的唯一/主键外键引用 原因 oracle给出的描述很清楚,意思是表中的主键,被其他的表当做外键进行了关联,无法删除。 解决办法 为了表达意思...
  • oracle中查询所有外键引用到某张表的记录   //查询表的主键约束名   select * from user_constraints e where e.table_name='表名';--输入   //查询所有引用到该主键的记录   SELECT ...
  • 查询主键外键引用的表

    千次阅读 2012-09-04 14:15:57
    在删除一些表的时候,经常会遇到主键被一些关系表中的外键引用,而无法删除,这时候就要找到主键是被哪张表引用,在oracle中有一个视图可以帮助我们 做到这一点,它就是user_constraints,在以下的例子中,'TSP_PK'...
  • 我在Shop 表中创建了一个主键(ID,UserID)(因为多张表分别需要用到这其中的一个列名),在另一张表创建外键引用时报错: "消息 1776,级别 16,状态 0,第 1 行 在被引用表 'Shop' 中没有与外键 'FK__Product' 中...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 54,797
精华内容 21,918
关键字:

怎么外键引用主键