精华内容
下载资源
问答
  • sql | 一张表有【两个外键

    千次阅读 2019-07-17 14:10:00
    现在三张表:如图, 要求1:现在要通过repair_id查询出worker两张中的信息: 连接: select * from repair t1,client_info t2 where t1.client_id = t2.client_id and t1.client_id="1" 外连接:left ...

    现在有三张表:如图,
    在这里插入图片描述


    要求1:现在要通过repair_id查询出worker两张表中的信息:


    连接:

    select * from repair t1,client_info t2
            where t1.client_id = t2.client_id and t1.client_id="1"
    

    在这里插入图片描述

    外连接:left outer join(保留repair原表,注入client)

    select * from repair t1
            left outer join client_info t2
            on t1.client_id = t2.client_id and t1.client_id="1"
    

    在这里插入图片描述


    要求2:现在要通过repair_id查询出workerclient三张表中的信息:


    内连接:inner join

    select * from 父表 t1
            inner join 子表1 t2
            on t1.外键1_id = t2.外键1_id 
    				inner join 子表2  t3
    				on t1.外键2_id=t3.外键_id
    

    内连接:(保留repair原表,注入client和worker)

    select * from repair t1
            inner join client_info t2
            on t1.client_id = t2.client_id 
    				inner join worker_info t3
    				on t1.worker_id=t3.worker_id
    

    在这里插入图片描述
    大功告成!

    展开全文
  • 我们要查询出B_DATAVIEW中的外键所对应的外键表中的名称 select ID, NAME, MASTERDATA, VIEWTYPE, (select name from T_BUSINESSSYSTEM where id = B_DATAVIEW.BUSISYS) BUSISYSNAME, (select name fro...

     

    我们要查询出B_DATAVIEW表中的外键所对应的外键表中的名称

    select
            ID, NAME, MASTERDATA, VIEWTYPE,
            (select name from T_BUSINESSSYSTEM where id = B_DATAVIEW.BUSISYS) BUSISYSNAME,
            (select name from T_BUSINESSSYSTEM where id = B_DATAVIEW.BUSIORGA) BUSIORGANAME,
            (select name from T_BUSINESSSYSTEM where id = B_DATAVIEW.BUSIVIEW) BUSIVIEWNAME,ENABLE
    from B_DATAVIEW

     

    展开全文
  • 在Flask的开发中,我们势必会遇到两张之间存在多个外键的情况。例如,现在两张一张表是`User`,另一张表是`Article`。一篇文章的作者`author_id`可以设置外键关联`User`,同时文章的审稿人`reviewer_id`也...

    在Flask的开发中,我们势必会遇到两张表之间存在多个外键的情况。例如,现在有两张表,一张表是User,另一张表是Article。一篇文章的作者author_id可以设置外键关联User表,同时文章的审稿人reviewer_id也可以设置外键关联User表。当我们以SQLAchemy多对一(many to one)的设计方法来添加relationship关系映射时,程序会抛出一个AmbiguousForeignKeysError错误,这篇文章我们就来解决这个问题。

    出现Error的代码写法

    先来看以SQLAchemy多对一的常规设计方法处理这个问题时我的代码写法。

    from flask_sqlalchemy import SQLAlchemy
    
    db = SQLAlchemy()
    
    class User(db.Model):
        __tablename__ = 'users'
        id = db.Column(db.Integer, primary_key=True)  
        email = db.Column(db.String(64), nullable=False, unique=True)  
        name = db.Column(db.String(32), nullable=False)  
        ...  
        
    class Article(db.Model):
        __tablename__ = 'articles'
        id = db.Column(db.Integer, primary_key=True)  
        title = db.Column(db.String(64), nullable=False) 
        author_id = db.Column(db.Integer, db.ForeignKey("users.id"))
        reviewer_id = db.Column(db.Integer, db.ForeignKey("users.id"))
        author = db.relationship('User', backref='articles')  
        reviewer = db.relationship('User', backref='review_articles')
        
    

    看起来程序的设计应该是没问题,可运行的结果真的跟我们预想的一样吗?
    当我们运行代码后,程序抛出了一个错误:

    sqlalchemy.exc.AmbiguousForeignKeysError: 
    Could not determine join condition between parent/child tables on relationship Article.author 
    - there are multiple foreign key paths linking the tables.  
    Specify the 'foreign_keys' argument, providing a list of those columns 
    which should be counted as containing a foreign key reference to the parent table. 
    

    可以看到SQLAchemy提示无法确定Article.author的父子表之间的关联,原因在于两张表之间存在多个外键。需要我们指定foreign_keys参数,提供一个包含关联了父表(即User表)外键的字段列表(list)

    解决办法

    查询了很多博客资料后这个问题依旧没有得到解决,只好去阅读SQLAchemy的官方文档,在SQLAchemy ORM > Relationship Configuation > Configuring how Relationship Joins下有关于Handling Multiple Join Paths的介绍。

    文档中说,在遇到两表之间存在多外键关联时,需要给relationship()指定foreign_keys参数。需要对我们的代码进行修改,添加foreign_keys参数,所以将代码修改为:

    from flask_sqlalchemy import SQLAlchemy
    
    db = SQLAlchemy()
    
    class User(db.Model):
        __tablename__ = 'users'
        id = db.Column(db.Integer, primary_key=True)  
        email = db.Column(db.String(64), nullable=False, unique=True)  
        name = db.Column(db.String(32), nullable=False)  
        ...
    
        def __repr__(self):
            return '<User id={0}, name={1}>'.format(self.id, self.name)  
        
    class Article(db.Model):
        __tablename__ = 'articles'
        id = db.Column(db.Integer, primary_key=True)  
        title = db.Column(db.String(64), nullable=False) 
        author_id = db.Column(db.Integer, db.ForeignKey("users.id"))
        reviewer_id = db.Column(db.Integer, db.ForeignKey("users.id"))
        author = db.relationship('User', backref='articles', foreign_keys=[author_id])  
        reviewer = db.relationship('User', backref='review_articles', foreign_keys=[reviewer_id])
    
        def __repr__(self):
            return '<Article id={0}, title={1}>'.format(self.id, self.title) 
        
    

    同时,在指定foreign_keys时,我们也可以使用字符串来指定。但如果使用列表,则列表必须是字符串的一部分。

    author = db.relationship('User', backref='articles', foreign_keys="[author_id]")
    

    在我们这个具体的例子中,不需要列表,所以可以写成:

    author = db.relationship('User', backref='articles', foreign_keys="author_id")
    

    测试

    在修改过后,我们运行程序,测试一下代码
    我们先给User表添加两条数据

    >>> zhangsan = User(email='zhangsan@123.com', name='张三')
    >>> lisi = User(emaill='lisi@123.com', name='李四')
    >>> db.session.add_all([zhangsan,lisi])
    >>> db.session.commit()
    

    接着给Article表添加一条记录,指定Author张三(users.id=1)Reviewer李四(usersid)

    >>> article = Article()
    >>> article.title = "Test"
    >>> article.author_id = 1
    >>> article.reviewer_id = 2
    >>> db.session.add(article)
    >>> db.session.commit()
    

    我们来做查询操作

    >>> article = Article.query.get(1)
    >>> article
    <Article id=1, title=Test>
    >>> article.author
    <User id=1, name=张三>
    >>> article.reviewer
    <User id=2, name=李四>
    

    可以看到我们可以正确的查询到article.authorarticle.reviewer,关于SQLAchemy中处理两张表之间存在多个外键的情况这个问题我们已经解决。

    扩展

    relationship()中我们添加了backref参数来对关系提供反向引用,这样更加方便了我们的查询操作。示例:

    >>> zhangsan = User.query.filter_by(name='张三').first()
    >>> zhangsan
    <User id=1, name=张三>
    >>> zhangsan.articles
    [<Article id=1, title=Test>]
    >>> zhangsan.review_articles
    []
    

    因为我们给artice.author添加了articles的反向引用,给article.reviewer添加了review_articles的反向引用。
    所以对于User 张三来说,他是article TestAuthor,可以通过article.author来查询得到张三。也可以通过zhangsan.articles反向查询得到Test这篇文章。
    同时,因为张三不是任何一篇文章的reviewer,所以通过zhangsan.review_articles查询到结果为空列表。
    同样的,我们来看李四的查询操作:

    >>> lisi = User.query.filter_by(name='李四').first()
    >>> lisi
    <User id=2, name=李四>
    >>> lisi.articles
    []
    >>> lisi.review_articles
    [<Article id=1, title=Test>]
    

    结果其实跟张三的查询是类似的,只是两人的角色authorreviewer不同,这里不再啰嗦。

    本文作者:buppter
    本文首发于https://buppter.xyz
    转载请注明出处!

    展开全文
  • 建表时创建外键: CREATE TABLE`xh` ( `id` int(100) unsigned NOT NULL AUTO_INCREMENT COMMENT , `cl_id` smallint(3) unsigned NOT NULL COMMENT, `title` varchar(100) COLLATE utf8_unicode_ci NOT NULL ...
    1. 建表时创建外键:
    CREATE TABLE`xh` (
     `id` int(100) unsigned NOT NULL AUTO_INCREMENT COMMENT ,
     `cl_id` smallint(3) unsigned NOT NULL COMMENT,
     `title` varchar(100) COLLATE utf8_unicode_ci NOT NULL COMMENT ,
     `details` text COLLATE utf8_unicode_ci NOT NULL COMMENT ,
     `date` datetime NOT NULL COMMENT ,
     `au_id` smallint(6) unsigned NOT NULL COMMENT ,
     `click` int(100) unsigned NOT NULL DEFAULT '0' COMMENT ,
     `reco` int(100) unsigned NOT NULL DEFAULT '0' COMMENT,
     PRIMARY KEY (`id`),
     KEY `fk_class` (`cl_id`),
     CONSTRAINT `fk_class`FOREIGN KEY  (`cl_id`)  REFERENCES  `fl` (`id`),
     KEY `fk_author` (`au_id`),
     CONSTRAINT `fk_author` FOREIGN KEY (`au_id`) REFERENCES `author` (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci  
    1. 建表后创建外键:
    Alter Table `ym` Add Constraint `fk_author` Foreign Key (`au_id`) References `author` (`id`);   
    1. 查看表结构:
    Show Create Table `ym`; 

    4.级联: 在末尾可加上(可单独添加,也可全部添加):

    ON UPDATE CASCADE(级联更新)
    ON DELETE CASCADE(级联删除) 

    比如:

    ALTER TABLE `ym`  ADD  CONSTRAINT  `fk_author`  FOREIGN  KEY  (`au_id`)
    展开全文
  • fans中字段 id,user_id,fans_id,其中user_id和fans_id都是跟user的id关联的外键,我发现这样会报错。 可是用户跟好友的信息又要与用户的信息关联,请问各位大神,怎样才不会报错或者什么好一点的解决...
  • (二)的连接与外键约束

    千次阅读 2015-08-10 20:35:29
    外键一张表的某个字段引用着另一张表的主键,在数据多的中多一字段,存储对应的另一张表的主键。 外键的创建: CONSTRAINT FOREIGN KEY REFERENCES (); 级联: 删除了一部分,对应关系的
  • 查询一个表的所有外键名称,主键名称,主键列ID,主键列名,外键表ID,外键列ID,外键列名 级联更新,级联删除,索引名称,索引字段名,索引字段位置
  • MySQL的几个概念:主键,外键,索引,唯一索引 概念: 主键(primary key) 能够唯一标识中某一行的属性或属性组。一个只能有一个主键,但可以有多个候选索引。主键常常与外键构成参照完整性约束,防止出现数据不...
  • 数据库设计中建议添加外键

    千次阅读 2019-04-02 17:34:30
    通过从知乎帖子的讨论进行整理如下: 先给出结论: 结论 外键是否采用看业务应用...若是把数据一致性的控制放到事务中,也即让应用服务器承担此部分的压力,而引用服务器一般都是可以做到轻松地水平的伸缩;2.传统...
  • 一直有个疑问待解决,这种方式,如果展示的数据太多那每次请求的接口次数就会很多 /** * 供应商名称 * 页面下拉框展示数据 * @return */ @GetMapping("/getPropertySupplierList") public Map&...
  • 一张表可以有多少主键

    万次阅读 2018-10-24 09:47:39
    总的来说,一张表中的外键只能,多的时候称为联合外键(好吧这样比较拗口) 1、数据库的每张只能主键,不可能主键。 2、所谓的一张表主键,我们称之为联合主键。  注:联合主键:就是...
  • MySQL外键约束中几个值的含义

    千次阅读 2016-09-22 17:55:22
    快要下班了,趁着活已经差不多干完了,自己倒腾了...a做为主,b中一列为外键关联到a。 我只测试了On Delete的各种情况。首先,外键约束为四值:RESTRICT,NO ACTION,CASCADE,SET NULL。 1、REST
  • MySQL关系--外键

    2019-09-22 03:37:16
    一、外键前戏 如果我们把所有的信息都记录在一张表中会带来的问题:  1.的结构不清晰  2....  3.的扩展性极差 ...1.站在学生的角度看班级:能否多学生在一班级 (一班级能否学生) 可...
  • 从上面的这个图可以看到在设计的时候,就给1添加一个外键...1、1可以有一个或者多个外键,也可以没有。(如果1有多个外键可不可以是这样的情况,2中的多个字段是1的外键;或者说1的多个外键是在多个中)
  • 数据库实现(一对多)2.1一对多情况的引入2.2利用外键实现一对多2.3数据库实现(一对多)2.3.1不设置外键的情况2.3.2为主(多)和从(一)之间添加外键2.3.3添加外键约束后的2特点(重要)2.3.4小...
  • 如何 从一个表中去查询shop的所有字段属性值,而且这个表的字段属性值都是从其他外键关联的的思路分析 首先明确我的目的,就是我要从这中去查询这个表中字段名关联的所有属性,关联着三个表(shopCategory...
  • 外键问题

    2021-01-05 13:47:17
    如果一字段a在一张表一)中是主关键字,而在另外一张表二)中不是主关键字,则字段a称为二的外键; 主键外键表的理解 (1)以公共关键字(也就是两张共有的字段)作主键的为主键(父,主...
  • MySQL数据库的主键和外键详解主键主键的定义主键:中经常列或多列的组合,其值能唯一地标识中的每一行。这样的一列或多列称为的主键,通过它可强制的实体完整性。当创建或更改时可通过定义 PRIMARY ...
  • 1.理解之间建立关系的必要性 比如我们建立了一张个人信息,把所有人的信息都存在...针对这问题我们可以将他们分成两张,一张专门记录个人信息,一张专门记录部门和部门工作 建立的时候我们需要进行分析...
  • 操作_外键_关联_查询

    千次阅读 2017-11-27 15:48:45
    外键是指引用另一个表中的一列或多列,被引用的列具有主键约束或唯一约束。(2)目的: 外键用于建立和加强两个表数据之间的连接。(3)概念: a. 主: 被引用的。 如 grade b.从 : 引用外键 。如 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 27,724
精华内容 11,089
关键字:

一张表可以有几个外键