精华内容
下载资源
问答
  • mysql外键类型

    千次阅读 2017-11-28 10:01:40
    mysql的外键类型为:RESTRICT、NO ACTION、CASCADE、SET NULL 1. CASCADE: 从父表中删除或更新对应的行,同时自动的删除或更新自表中匹配的行。ON DELETE CANSCADE和ON UPDATE CANSCADE都被InnoDB所支持。 2. SET ...

    mysql的外键类型为:RESTRICT、NO ACTION、CASCADE、SET NULL

    • CASCADE: 从父表中删除或更新对应的行,同时自动的删除或更新自表中匹配的行。ON DELETE CANSCADE和ON UPDATE CANSCADE都被InnoDB所支持。
    • SET NULL: 从父表中删除或更新对应的行,同时将子表中的外键列设为空。注意,这些在外键列没有被设为NOT NULL时才有效。ON DELETE SET NULL和ON UPDATE SET SET NULL都被InnoDB所支持。
    • NO ACTION: InnoDB拒绝删除或者更新父表。
    • RESTRICT: 拒绝删除或者更新父表。指定RESTRICT(或者NO ACTION)和忽略ON DELETE或者ON UPDATE选项的效果是一样的。
    • SET DEFAULT: InnoDB目前不支持

      企业开发中一般不使用外键,通过代码业务逻辑去实现外键功能

    展开全文
  • 有效地为每个domain_id和类型提供最新的日志. 只是描述它让我感到愚蠢,但我似乎无法做到正确.. 谢谢你的帮助. 克里斯 编辑: 为了将来参考,如果您想要从第一个表中选择所有记录并显示已连接表的最新记录(在这种情况...

    我完全被看似简单的问题所困扰.也许我只是感到困惑,因为我一直在思考/谷歌搜索/搜索它太久了.

    请考虑下表:

    log_id (auto increment primary key)

    domain_id (foreign key to "domains" table)

    type (enum('notice','warning'))

    message (varchar)

    执行以下选择:

    SELECT *

    FROM logs

    WHERE domain_id = 4

    比如,给我2个“通知”类型的日志和3个“警告”类型的日志.

    我如何仅选择具有最高ID类型的日志?有效地为每个domain_id和类型提供最新的日志.

    只是描述它让我感到愚蠢,但我似乎无法做到正确..

    谢谢你的帮助.

    克里斯

    编辑:

    为了将来参考,如果您想要从第一个表中选择所有记录并显示已连接表的最新记录(在这种情况下选择所有域及其最新日志记录(如果可用)),只需在域上包含一个选择桌子周围:

    SELECT

    domains.*,

    logs.*

    FROM

    domains

    LEFT JOIN (

    SELECT

    l.*

    FROM

    logs l

    INNER JOIN (

    SELECT

    MAX(log_id) as maxid

    FROM

    logs

    GROUP BY

    domain_id

    type

    ) l3 ON l.log_id = l3.maxid

    ) l2 USING (domain_id)

    展开全文
  • 最近给项目上Typescript,记录在迁移的过程中遇到的一个问题。 问题背景 ...User有一个外键关联的Company,和很多外键关联的Orders。 interface IUser & Document{ _id: string; company: string...

    最近给项目上Typescript,记录在迁移的过程中遇到的一个问题。

    问题背景

    下面这段代码 定义了一个User 接口, Company接口, Order接口以及相应的mongoose model。 User有一个外键关联的Company,和很多外键关联的Orders。

    interface IUser & Document{
      _id: string;
      company: string | ICompany;
      orders: string[] | IOrder[];
    }
    
    interface ICompany & Document{
      _id: string;
      name: string;
    }
    
    interface IOrder & Document{
      _id: string
      title: string;
    }
    
    const userSchema: Schema = new Schema({
      company: { type: ObjectId, ref: 'Company' },
      orders: [{ type: ObjectId, ref: 'Order' }]
    });
    
    const companySchema: Schema = new Schema({
      name: String
    });
    
    const orderSchema: Schema = new Schema({
      title: String
    });
    
    export const User: Model<IUser> = mongoose.model('User', userSchema);
    const Company: Model<ICompany> = mongoose.model('Company', companySchema);
    const Order: Model<IOrder> = mongoose.model('User', orderSchema);
    复制代码

    问题重现

    使用时可能遇到如下场景:

    import { User } from 'models'
    User.findOne()
    .populate({ 'path': 'company' })
    .populate({ 'path': 'orders'})
    .then(user => {
        // 在此处尝试访问直接populate 出来的 company object的属性,会遇到编译器报错
        // Property '_id' does not exist on type 'string | ICompany'.
        // Property '_id' does not exist on type 'string'.
        const companyId = user.company._id
    
        // 在此处尝试访问order.map,会遇到编译器报错
        // Cannot invoke an expression whose type lacks a call signature. 
        // '(<U>(callbackfn: (value: string, index: number, array: string[]) => U, thisArg?: any) => U[]) 
        // | (<U>(callbackfn: (value: TOrder, index: number, array: TOrder[]) => U, thisArg?: any) => U[])'
        // has no compatible call signatures.ts(2349)
        user.orders.map(order => order)
    })
    
    复制代码

    这两个问题都涉及到了对联合类型的理解的问题。在写这两行代码的时候我理所应当的认为联合类型就是 或(or)的意思。 即,取决于是否调用populate方法:

    • company 可以是 string 或者 Company对象
    • orders 可以使 string数组或者 Order对象的数组

    那么理所应当user.company._id 和 user.orders.map 都应该可以直接调用而没有问题的。

    问题原因

    那么编译器为什么会报错呢? 仔细读了一下文档发现:

    如果一个值是联合类型(Union Types),我们只能访问此联合类型的所有类型里共有的成员。

    这里的联合类型并不是并集的意思,而可以理解为交集。

    • string没有string._id。编译器报错。

    而第二个问题,则比较复杂而且一直有人在提解决方案,后面再说一下。

    问题解决

    那么这种情况改怎么解决呢?

    类型断言/重载 type assertion

    对于第一个问题,其实当时想到了一个方法就是用Type Assertion

    const company = user.company
    const companyId = (company as ICompany)._id
    复制代码

    这样编译器就不会报错了,虽然能解决问题,但其实并不是一个很安全的操作。需要在写代码的时候清晰的搞清楚什么时候populate了,什么时候没有populate。(虽然看起来很简单但这其实是增加了一个human error的机会)

    所以又去读了读文档发现了:

    自定义类型保护 (type guard) 利用typescript的自定义类型保护,这样编译器就能确认类型从而不会报错了。

    function isCompany(obj: string | ICompany): obj is Company {
        return obj && obj._id;
    }
    
    import { User } from 'models'
    User.findOne()
    .populate({ 'path': 'company' })
    .populate({ 'path': 'orders'})
    .then(user => {
        if(isCompany(user.company)
          const companyId = user.company._id
        // ...
    })
    复制代码

    数组类型定义使用混合类型

    但是第二个问题就有点无语,两个类型都是数组,怎么连map都调用不了?

    先给一个解决方案吧:

    interface IUser & Document{
      // 原来的声明 orders: string[] | IOrder[];
      orders: (string | IOrder)[]
    }
    复制代码

    这样编译器问题可以解决了,但是实际上这个声明会允许['id', order]这样的混合数组存在。我们需要的是要么 ['id','id'], 要么[order, order].

    在github上这个issue也被提了很多次,最早可以追溯到2016年,并且最近依旧在不断被提起,感兴趣的可以去看一下:Call signatures of union types

    另外,11天前有人开了一个新issue Wishlist: support for correlated record types 希望能解决这个问题。

    Typescript语言的开发者Ryan也针对开发者jcalz的在最新的一个issue里评论了。

    会持续关注这个问题。

    转载于:https://juejin.im/post/5ca7ffd2f265da30cf176f60

    展开全文
  • 字符串类型Char 和varchar在定义char 跟varchar时,都需要设置长度。语法:char(M); 最大长度为255varchar(M); 最大长度为65532不同编码长度不同GBK最大为:32767utf8最大为:21845M为长度!两者区别:Char的M是固定...

    字符串类型

    Char 和varchar

    在定义char 跟varchar时,都需要设置长度。

    语法:

    char(M); 最大长度为255

    varchar(M); 最大长度为65532不同编码长度不同GBK最大为:32767

    utf8最大为:21845

    M为长度!

    两者区别:

    Char的M是固定的,即使输入的字符长度小于M值,该字符长度也会被定义为M值;

    效率更快,使用一些固定字符长度的时候可以使用,例:电话号码、身份证号码等!

    Varchar的M是范围性值,只要不超过M,输入的值长度为多少即为多少!存储空间更加灵活。

    text

    文本类型,主要分为四种:

    tinyText,text,mediumText,longtext

    字符长度不需要定义

    从左往右排序,越往后值越大,longtext的值几乎是无限大!

    主要运用在文本框和其他自由输出区域(如:一篇文章、一篇新闻等)!

    enum

    单选项字符串类型

    语法:

    enum(选项字符串1,选项字符串n);

    插入值的时候,只能插入选项字符串中的一个字符串,其他则无效,会出现报错!

    因为enum在存储空间中是以整数的形式存储,所以我们可以在插入值的时候直接插入对应字符串的编号,从左往右开始,起始值为1.

    Set

    多选项字符串类型

    语法方面与单选项一样,区别在于插入值的时候可以插入多个值!

    同单选项一样,可以通过字符串编号来读取,只不过排序不同,排序规则,从左往右,依次为1.2.4.8.16.32.64   最多只能到64

    Binary,varbinary,blob

    二进制文本类型,想当计算机的话可以自己谷歌学习,那不是人学的!

    列属性

    语法格式:列属性是在创建表的时候,填写在字段类型后面的

    null和nonull

    null允许字段为空;

    Nonull 不允许字段为空,如果字段设置了这个属性的话,系统会判断字段是否为空,如果有设置默认值(default),如果没有的话,系统会报错!

    Default

    字段默认值

    语法:

    default  默认值 默认值可以是整数也可以是字符串

    primary key

    主键

    1.定义一个字段为主键后,该字段不能重复;

    2.主键的内容不能为空

    3.一个表中主键只能有一个

    4.也叫做主键索引

    定义主键的方法

    1.定义一个字段的时候直接在后面加上primary key ;

    2.定义完字段后再定义主键 语法:primary key(字段);

    这种方法可以创造出组合主键,将两个字段组合成一个主键,但是要记住,主键只有一个

    组合主键语法: primary key(字段名1,字段名2);

    Unique key

    唯一键

    也叫作唯一索引

    跟主键基本一样,定义方法也一样

    区别:唯一键可以为空,主键不能为空!

    auto_increment

    自增长属性

    作用是每次插入记录的时候,自动的为某个字段的值加1(基于上一个记录)

    注意:

    使用这个属性有两个条件:

    1, 该字段类型必须为整型

    2, 该字段上必须存在索引(后面讲,主键也叫作主键索引,唯一键也叫作唯一键索引)

    auto_increment 自动增长初始值

    语法格式:在定义完字段后增加auto_increment 初始值

    comment

    字段内注释

    外键

    一张表内的一个字段指向、引用着另外一张表内的另外一个字段

    负责指向的表为子表,被指向的表为主表

    作用:

    1, 增加子表记录的时候,是否有与之对应的父表记录!

    2, 当删除或更改父表记录的时候,从表应该如何处理相关的记录!

    语法格式:

    foreign key(子表字段) references父表名(父表主键)

    先有父表再有字表,语法写在创建字表的字段内;

    定义外键名

    定义外键名后方便删除

    Constraint 外键名foreign key(子表字段) references父表名(父表主键)

    外键名不能加引号!

    如果想要修改父表的话需要再设置一个级联操作命令,当在操作父表时,子表会受到什么样的影响,如果没有设置级联操作,更改父表会报错!

    级联操作

    主表更新

    语法形式为:on update[级联操作]

    主表删除

    语法形式为:on delete[级联操作]

    这里的级联操作常见的有三种形式:

    cascade:同步操作,或者串联操作!也就是当主表记录删除或更新的时候,从表也进行相应的删除或更新!

    set null:设置为null,也就是当主表记录删除或更新的时候,从表中的外键字段设置为空

    restrict:拒绝主表的更新或删除

    删除外键的语法

    alter table 表名drop foreign key外键名;

    展开全文
  • #如果父表的主键是复合主键,那么子表也需要指定两列对应 constraint fk_fkname foreign key (id1,id2) references table_name(pid1,pid2)#父表:外表,主键被指向的表, 子表:设置外键的那张表#外键的默认...
  • 所以.Net和Java 都在看,两边的系统也都在开发中,好不容易啃了将近5本的Net,终于将两个系统连起来了,结果碰到了一个问题,我在Item表内定义的owner_username为外键,是String类型的,关联表是User,关联字段是...
  • 对于同时操作多个表的情况下 比如同时联合查询 那么会涉及到某些表中存在外键外键在一个表中却是另外一个类型的参数 那么就需要进行类型转换 比如在SRC目录下新一个新包 该包下的class文件实际上和entity下的表...
  • SELECT * FROM information_schema.columns a JOIN information_schema.TABLES b ON a.table_schema=b.table_schema AND a.table_name =b.table_name WHERE a.table_name IN( SELECT TABLE_NAME FROM TABLES WHERE
  • 1、创建表create table 表名(列名 类型 是否可以为空,列名 类型 是否可以为空)ENGINE=InnoDB DEFAULT CHARSET=utf8是否可空,null表示空,非字符串not null - 不可空null - 可空默认值,创建列时可以指定默认值,当...
  • 外键

    2011-02-16 22:58:00
    数据库mysql <br />建立外键的前提: 本表的列必须与外键类型相同(外键必须是外表主键)。 <br />外键作用: 使两张表形成关联,外键只能引用外表中的列的值! <br />指定主键关键字: ...
  • link 环境下,如何处理外键查询的多类型结构,外键类型查询的实现是什么?
  • 查询外键

    2019-05-08 12:06:19
    ----查询外键 SELECT A.owner 外键拥有者, A.table_name 外键表, A.constraint_type 外键类型, C.column_name 外键列, b.owner 主键拥有者, b.table_name 主键表, b.constraint_type 主键类型, d....
  • mysql如何修改外键约束类型

    千次阅读 2019-03-02 17:39:42
    INnoDB存储引擎支持外键外键约束类型有: 1.RESTRICT(mysql默认):拒绝更新或删除(是拒绝更新还是删除看外键的具体设置)主表被外键引用的列。 2.NO ACTION:同RESTRICT 3.SET NULL:更新或删除主表对应列,...
  • mysql建立外键

    2021-01-20 00:11:20
    建立外键的前提:本表的列必须与外键类型相同(外键必须是外表主键)。 外键作用: 使两张表形成关联,外键只能引用外表中的列的值! 指定主键关键字: foreign key(列名) 引用外键关键字: references <外键...
  • 数据库外键

    2020-03-31 10:50:52
    表的字段必须与外键类型相同 insert table2的时候会检查foreign key是否在table1中存在,不存在则返回失败 delete table1某行数据的时候检查table2中是否有foreign key关联,有关联则返回失败 使用外键的优...
  • MySQL外键约束类型

    2015-12-10 01:21:00
    2019独角兽企业重金招聘Python工程师标准>>> ...在使用外键的时候,可以适当的选择所需的约束类型使用。 转载于:https://my.oschina.net/mobinchao/blog/541810
  • mysql 外键

    2014-08-25 12:54:00
    外键的作用:  保持数据一致性,完整性,主要目的是控制存储在外键表中的数据。 使两张表形成关联,外键只能引用外表中的列的值!... 建立外键的前提: 本表的列必须与外键类型相同(外键必须是外表主键)。...
  • mysql 设置外键数据库mysql 建立外键的前提:本表的列必须与外键类型相同(外键必须是外表主键)。外键作用:使两张表形成关联,外键只能引用外表中的列的值!指定主键关键字:foreign key(列名)引用外键关键字:...
  • 还有十五分钟图书馆关闭,赶紧来把今天的关于MySQL外键修改的内容记录一下。 背景: 在写作业的时候必要的建立了两个数据表。...修改外键的字段类型为int(10) 先修改了数据表users的字段id为int(10). alter table us...
  • 如题,关联外键的时候,报错类型匹配。但是两个 类型都是int sql 如下: CREATE TABLE IF NOT EXISTS `alert_receiver_map` ( `id` INT UNSIGNED AUTO_INCREMENT, `alert_id` INT NOT NULL, `receiver_id` INT ...
  • 例如:a b 两个表a表中存有 客户号,客户名称b表中存有 每个客户的订单有了外键后你只能在确信b 表中没有客户x的订单后,才可以在a表中删除客户x建立外键的前提: 本表的列必须与外键类型相同(外键必须是外表主键)。...
  • 例如:a b 两个表a表中存有 客户号,客户名称b表中存有 每个客户的订单有了外键后你只能在确信b 表中没有客户x的订单后,才可以在a表中删除客户x建立外键的前提: 本表的列必须与外键类型相同(外键必须是外表主键)。...
  • SQL中的外键

    万次阅读 2019-06-26 21:03:31
    从表外键类型,必须与主表主键类型一致。 作用:外键可以保证数据的完整性和一致性 格式:(2种) [constraint 外键约束关系的名称] foreign key 从表(外键字段名称) references 主表(主...
  • MySQL外键

    2009-07-17 11:20:07
    建立外键的前提: 本表的列必须与外键类型相同(外键必须是外表主键)。 外键作用: 使两张表形成关联,外键只能引用外表中的列的值。 指定主键关键字: foreign key(列名) 引用外键关键字: references &lt;...
  • mysql外键

    2009-04-08 22:09:54
    建立外键的前提: 本表的列必须与外键类型相同(外键必须是外表主键)。 外键作用: 使两张表形成关联,外键只能引用外表中的列的值! 指定主键关键字: foreign key(列名) 引用外键关键字: references &...
  • MySQL 外键

    2011-05-15 10:25:11
    MySQL 外键 外键的作用: 保持数据一致性,完整性,主要目的是控制存储在外键表中的数据。 使两张表形成关联,外键只能引用外表中...建立外键的前提: 本表的列必须与外键类型相同(外键必须是外表主键)。 指定主...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,370
精华内容 2,548
关键字:

外键类型