前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布

Note

作者头像
仇诺伊
发布2020-04-24 16:02:00
7140
发布2020-04-24 16:02:00
举报
文章被收录于专栏:佳爷的后花媛佳爷的后花媛

虽然每天和数据库打交道,但是对这个老伙计真的是不太了解,今天早上看到一篇文章说不推荐使用关系型数据库,咦,好像现在大部分使用的都是关系型数据库啊,那篇文章的点赞率还是蛮高的,难道是我对关系型数据库有什么误解么?于是上维基看看,我接触的大部分都是关系型数据库,于是又把那篇文章看了一遍,关于他说的关系型数据库存在一堆问题,但是我实在没怎么用过其他的数据库

,感受不到这些。弱弱的看大佬们在文章下面激烈的讨论。

看来这哥们对关系型数据库有很大的怨念啊,像我这样的弱鸡,让用哪个就用哪个,反正都不会用。

笔记

抛开大佬们的怨念,回到弱鸡的小巢中,日常记录下小笔记。

最近sql用的比较多,嗯,凭借之前渣渣的sql已经不能蒙混过关了,得充点电,不然就要暴露了。

刚刚和新来的同事聊了聊git,哈哈哈 ,看到他遇到和我之前差不多的问题,然后对冲突一脸懵逼,作为老鸟的我,忍不住得瑟下,告诉他,你踩的坑姐姐都踩过,哈哈哈哈,不过我下次得记下git的笔记了,感觉一段时间过去了,好像又忘的差不多了,可怕的老年记忆。

主要看了看基本的sql语句,当年的数据库课真的都是睡过去啊,看到约束和foreign以及alter和drop的时候,哇咔,这玩意哪来的,我居然都没看过,只会curd的渣渣,没文化真可怕。

  • SQL 约束
  • SQL NOT NULL
  • SQL UNIQUE
  • SQL PRIMARY KEY
  • SQL FOREIGN KEY
  • SQL CHECK
  • SQL DEFAULT
  • SQL CREATE INDEX
  • SQL DROP
  • SQL ALTER
  • SQL Auto Increment

不过今天主要是了解了下1:1 1:n n:n是啥玩意,当时看到这几个比例,懵逼了,哦,原来是建表时的关联。这个我还是用到过一些,soga,就是各个表之间的关联,嗯,了解下。举了个栗子,不过显然,是copy网上的栗子,真是懒,这么懒怎么学好?

代码语言:javascript
复制
mysql> SHOW DATABASES;
mysql> USE yourdatabse;
mysql> CREATE TABLE product_details (
          productID  INT UNSIGNED   NOT NULL,
          comment    TEXT  NULL,
          PRIMARY KEY (productID),
          FOREIGN KEY (productID) REFERENCES products (productID)
       );
mysql> CREATE TABLE IF NOT EXISTS products (
         productID    INT UNSIGNED  NOT NULL AUTO_INCREMENT,
         productCode  CHAR(3)       NOT NULL DEFAULT '',
         name         VARCHAR(30)   NOT NULL DEFAULT '',
         quantity     INT UNSIGNED  NOT NULL DEFAULT 0,
         price        DECIMAL(7,2)  NOT NULL DEFAULT 99999.99,
         supplierID   INT UNSIGNED  NOT NULL DEFAULT 0,
         PRIMARY KEY  (productID)
       );
代码语言:javascript
复制
mysql> UPDATE products SET supplierID = 501;

1) 1–1

如果有另一个名为product_details的表,并连接具有一对一关系的产品,如图所示,该怎么办?

写个外键

代码语言:javascript
复制
mysql> INSERT INTO product_details VALUES (1001, ‘good one’);
通过外健查询
代码语言:javascript
复制
mysql> SELECT products.productID,price,product_details.comment
       FROM products 
       JOIN product_details ON products.productID 
       = product_details.productID
       WHERE price < 5;

2) 1–n

假设每个产品都有一个供应商,每个供应商提供一个或多个产品,供应商 - 产品基于1-n关系模型。要实现1-n关系,只要确保不超过ROW与同一产品的关系,技术上就与1-1关系相同。

创建一个外健列

要将产品子表的supplierID列的外键添加到供应商父表:

  • 在product表中添加INT类型的supplierID列
  • 设置现有记录的所有supplierID
  • 将supplierID设置为外键列,按相关产品表设置为父级
  1. suppliers table mysql> ALTER TABLE products
  2. ADD COLUMN supplierID INT UNSIGNED NOT NULL;
代码语言:javascript
复制
mysql> UPDATE products SET supplierID = 501;
代码语言:javascript
复制
mysql> ALTER TABLE products
       ADD FOREIGN KEY (supplierID) REFERENCES suppliers (supplierID);
Write foreign key column

它与编写INT列相同

代码语言:javascript
复制
mysql> INSERT INTO products VALUES 
(1001, 'PEN', 'Pen Red', 5000, 1.23, 503);
Query OK, 1 row affected (0.00 sec)
通过外键列查询关系
代码语言:javascript
复制
mysql> SELECT products.name, price, suppliers.name 
       FROM products 
          JOIN suppliers ON products.supplierID =  suppliers.supplierID
       WHERE price < 5;

3) n–n

假设一个产品有很多供应商;供应商以所谓的多对多关系供应许多产品。对于多对多关系,它需要第三个表称为联结表。

创建联结表 products_suppliers
代码语言:javascript
复制
mysql> CREATE TABLE products_suppliers (
         productID   INT UNSIGNED  NOT NULL,
         supplierID  INT UNSIGNED  NOT NULL,
                     -- Same data types as the parent tables
         PRIMARY KEY (productID, supplierID),
                     -- uniqueness
         FOREIGN KEY (productID)  REFERENCES products  (productID),
         FOREIGN KEY (supplierID) REFERENCES suppliers (supplierID)
       );
插入关系
查询三个关联表

Use SELECT with JOIN to query data from the 3 tables

代码语言:javascript
复制
mysql> SELECT products.name AS `Product Name`, 
price, suppliers.name AS `Supplier Name`
       FROM products_suppliers 
          JOIN products  ON 
          products_suppliers.productID = products.productID
          JOIN suppliers ON 
          products_suppliers.supplierID = suppliers.supplierID
       WHERE price < 5 AND products.name = "Pen Red1" 
       AND suppliers.name = "QQ Corp";

如果使用多对多关系,则必须引入一个JOIN表(或联结表),该表保存两个参与表的外键,这进一步增加了联接操作成本。

大概了解了关于表之间的关联,不过对于数据库啥的缓存什么的,还是暗中观察吧,明天把剩下的sql看完,又可以看其他的了,嘎嘎,真是啥都不会,回家洗洗睡咯。

■ ■■■■

Basic

基础

数组函数

array_fill_keys — 使用指定的键和值填充数组

array_fill — 用给定的值填充数组

array_filter — 用回调函数过滤数组中的单元

array_flip — 交换数组中的键和值

array_intersect_assoc — 带索引检查计算数组的交集

array_intersect_key — 使用键名比较计算数组的交集

array_intersect_uassoc — 带索引检查计算数组的交集,用回调函数比较索引

array_intersect_ukey — 用回调函数比较键名来计算数组的交集

array_intersect — 计算数组的交集

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-08-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 佳爷的后花媛 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1) 1–1
    • 通过外健查询
    • 2) 1–n
      • 创建一个外健列
        • Write foreign key column
          • 通过外键列查询关系
          • 3) n–n
            • 创建联结表 products_suppliers
              • 插入关系
                • 查询三个关联表
                • 如果使用多对多关系,则必须引入一个JOIN表(或联结表),该表保存两个参与表的外键,这进一步增加了联接操作成本。
                相关产品与服务
                数据库
                云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档