V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
aoscici2000
V2EX  ›  MySQL

mysql 外键设置和查询

  •  
  •   aoscici2000 · 2019-07-17 11:51:15 +08:00 · 4600 次点击
    这是一个创建于 1952 天前的主题,其中的信息可能已经有所发展或是发生改变。
    
    CREATE TABLE `author` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(16) NOT NULL,
    )
    
    CREATE TABLE `catalog` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(16) NOT NULL,
    )
    
    CREATE TABLE `article` (
      `id` int(11) NOT NULL AUTO_INCREMENT',
      `catalog_id` int(11) NOT NULL COMMENT '目录 id',
      `author_id` int(11) NOT NULL COMMENT '作者 id',
      CONSTRAINT `author_fk` FOREIGN KEY (`author_id`) REFERENCES `author` (`id`),
      CONSTRAINT `catalog_fk` FOREIGN KEY (`catalog_id`) REFERENCES `catalog` (`id`)
    )
    
    

    如以上所示的三张表, 在 article 创建外键的时候, 一般是用 id 还是直接使用 name 的好(name 值可能经常会做出修改)?

    如果外键用 id, 查询 article 怎么能让结果返回直接使用 name 显示

    16 条回复    2019-07-18 09:08:56 +08:00
    codingadog
        1
    codingadog  
       2019-07-17 12:14:03 +08:00 via Android
    不要用外键
    连表查询
    aoscici2000
        2
    aoscici2000  
    OP
       2019-07-17 12:28:50 +08:00
    @codingadog 为何呢?
    gz911122
        3
    gz911122  
       2019-07-17 13:06:15 +08:00
    @aoscici2000 因为没啥必要..
    agdhole
        4
    agdhole  
       2019-07-17 13:13:23 +08:00
    不要用外键
    sunny2580839896
        5
    sunny2580839896  
       2019-07-17 13:37:04 +08:00
    为啥不用外键??不用外键两个表怎么关联???只是针对上面回答的一些疑惑。
    laravel
        6
    laravel  
       2019-07-17 13:41:58 +08:00
    一般不用外键约束,就是这个
    CONSTRAINT `author_fk` FOREIGN KEY (`author_id`) REFERENCES `author` (`id`),
    CONSTRAINT `catalog_fk` FOREIGN KEY (`catalog_id`) REFERENCES `catalog` (`id`)
    LeeSeoung
        7
    LeeSeoung  
       2019-07-17 13:51:30 +08:00
    人为约定而不建立约束。。因为外键约束很容易出问题,外键一般推荐用唯一标志 id
    akira
        8
    akira  
       2019-07-17 14:05:48 +08:00   ❤️ 1
    刚学数据库吧,如果是考试,那就老老实实按着书本来做。如果是工作了,三范式什么的就赶紧扔了。

    1. 工作环境严重不建议用“ FOREIGN KEY ”, 直接做索引连表查询就好了。 更进一步的话,我们会把作者和分类的名字都冗余进文章表里面,这样直接单表就能出必要数据了。

    2. 典型 的 sql 的 left join 应用场景
    fhsan
        9
    fhsan  
       2019-07-17 14:10:57 +08:00
    如果不用外键,一定要有一套代码来检查逻辑,要不然就是作死。
    iwishing
        10
    iwishing  
       2019-07-17 14:16:12 +08:00
    看你数据量多少了
    有很多最佳实践提倡不要用外键,实际看你自己的需求。
    hailiang88
        11
    hailiang88  
       2019-07-17 14:26:00 +08:00
    外键可以保持数据一致性啊
    arthas2234
        12
    arthas2234  
       2019-07-17 14:41:56 +08:00
    1、关联 id
    2、关联查询,left join 搞定
    3、不要用外键
    SKull4
        13
    SKull4  
       2019-07-17 16:12:51 +08:00
    @akira #8 这算不算一种倒退
    haon
        14
    haon  
       2019-07-17 16:39:06 +08:00
    想知道大厂现在都抛弃外键了吗
    akira
        15
    akira  
       2019-07-17 18:31:54 +08:00
    @SKull4 怎么会,理论都是说的理想情况,现实情况和理论不符合的多了去了
    qsbaq
        16
    qsbaq  
       2019-07-18 09:08:56 +08:00
    不要用外键+1
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3736 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 10:42 · PVG 18:42 · LAX 02:42 · JFK 05:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.