Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql更新多行_Mysql_Database_Database Design_Many To Many - Fatal编程技术网

Mysql更新多行

Mysql更新多行,mysql,database,database-design,many-to-many,Mysql,Database,Database Design,Many To Many,我有两张桌子类别表中的“媒体id”引用了媒体表中的“id”。媒体表中的每个项目都可以有类别表中的零个或多个类别 媒体表 类别表 __________________________ | id | category | media_id | |--------------------------| | 1 | fashion | 1 | |--------------------------| | 2 | sport | 2 | |-----------

我有两张桌子类别表中的“媒体id”引用了媒体表中的“id”。媒体表中的每个项目都可以有类别表中的零个或多个类别

媒体表


类别表

 __________________________
| id | category | media_id |
|--------------------------|
| 1  | fashion  | 1        |
|--------------------------|
| 2  | sport    | 2        |
|--------------------------|
| 3  | sport    | 3        | 
|--------------------------|
| 4  | cats     | 4        |
|--------------------------|
| 5  | dogs     | 4        |
|--------------------------|
| 6  | sport    | 5        | 
|__________________________|
当我在表中保存数据时,我想更新类别。我以前的方式是:

对于每种媒体:

  • 删除以前的类别:

    从媒体id=%d的类别表中删除

  • 添加新类别

  • 对于每个类别:(可以是零个或多个)

    插入类别表(类别、媒体id)

    这很好,但是它会运行很多查询(对于每个媒体,删除以前的类别+如果该媒体上存在类别,则为每个新类别插入新类别)

    我已经有一个类别表中的约束,该表引用了具有该媒体id的媒体表,每次删除媒体时,该媒体的所有类别都将被删除。这很有效

    问题是当有人编辑所有这些媒体时(添加和删除所有这些媒体上的某些类别),我想保存这些更改


    如何改进更新类别表的过程?

    您需要三个表和一些重新编程

    第一张表:
    媒体(mid等,etc2)

    第二个表:
    category(cid,category)

    第三,关系表:
    rel\u cat\u media(id、ref\u cid、ref\u mid)

    在这里创建表

    CREATE TABLE `media` (
      `mid` BIGINT  AUTO_INCREMENT PRIMARY KEY,
      `etc` datetime DEFAULT NULL,
      `etc` int DEFAULT NULL,
      `etc` varchar(20) NOT NULL 
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
    
    
    CREATE TABLE `category` (
      `cid` BIGINT AUTO_INCREMENT PRIMARY KEY,
      `category`  varchar(20) NOT NULL 
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
    
    CREATE TABLE `rel_cat_media` (
        id BIGINT AUTO_INCREMENT PRIMARY KEY,
        ref_cid BIGINT NOT NULL,
        ref_mid BIGINT NOT NULL,
        INDEX (ref_cid , ref_mid),
        UniQUE (ref_cid , ref_mid)
    );
    
    当您有新类别时,您不会删除类别,只会添加到类别中

    当您删除介质时,您会有一个
    删除后触发器
    ,该触发器还会从删除介质中删除所有具有介质id的行,因此您可以一次删除多个介质并删除所有相关行

    新媒体行可以插入关系表中的行,也可以不插入行。 但这可以通过在gui中选择类别,然后使用新插入的mid(媒体id)运行循环来实现

    它只是一个小程序,你没有太多的麻烦


    只有
    选择
    查询需要另一个
    内部联接

    您需要三张桌子和一些重新编程

    第一张表:
    媒体(mid等,etc2)

    第二个表:
    category(cid,category)

    第三,关系表:
    rel\u cat\u media(id、ref\u cid、ref\u mid)

    在这里创建表

    CREATE TABLE `media` (
      `mid` BIGINT  AUTO_INCREMENT PRIMARY KEY,
      `etc` datetime DEFAULT NULL,
      `etc` int DEFAULT NULL,
      `etc` varchar(20) NOT NULL 
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
    
    
    CREATE TABLE `category` (
      `cid` BIGINT AUTO_INCREMENT PRIMARY KEY,
      `category`  varchar(20) NOT NULL 
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
    
    CREATE TABLE `rel_cat_media` (
        id BIGINT AUTO_INCREMENT PRIMARY KEY,
        ref_cid BIGINT NOT NULL,
        ref_mid BIGINT NOT NULL,
        INDEX (ref_cid , ref_mid),
        UniQUE (ref_cid , ref_mid)
    );
    
    当您有新类别时,您不会删除类别,只会添加到类别中

    当您删除介质时,您会有一个
    删除后触发器
    ,该触发器还会从删除介质中删除所有具有介质id的行,因此您可以一次删除多个介质并删除所有相关行

    新媒体行可以插入关系表中的行,也可以不插入行。 但这可以通过在gui中选择类别,然后使用新插入的mid(媒体id)运行循环来实现

    它只是一个小程序,你没有太多的麻烦


    只有
    选择
    查询需要另一个
    内部联接

    这应该首先规范化,并且应该有一个关系表,这样您可以将所有类别存储在一个表中,并且只添加新类别,该表将永远不会那么大。介质表和关系表是唯一必须使用的表,因此,删除介质时,可以在触发器中删除关系。当你添加时,你也会在关系中添加新行。你能解释一下吗?我已经编辑了我的问题,并提供了更多关于我想要实现的目标的信息。请看,这应该首先规范化,并且应该有一个关系表,这样您可以将所有类别存储在一个表中,并且只添加新的类别,该表将永远不会那么大。介质表和关系表是唯一必须使用的表,因此,删除介质时,可以在触发器中删除关系。当你添加时,你也会在关系中添加新行。你能解释一下吗?我已经编辑了我的问题,并提供了更多关于我想要实现什么的信息。看到这样的结构需要对我当前的布局进行重大更改,但这是一种正确的方法,我愿意尝试。是的,对于未规范化的表,这总是一个问题,但对于mysql,您可以编写INSERT I'to SELECT querys,触发器很简单,剩下的是一些工作。rel_cat_media表有2个主键和id列。为什么这里需要id列?它没有在user_roles表中提到id列,这是因为我没有定义外键并将id作为主键与合并索引自动递增,在极少数情况下,我还将关系表引用到另一个表,因此我只有1个bigint可引用。和字段。此外,我不会更快。另一个好处是,当您删除一个分类时,关系表将变为零,没有错误。您可以使用每个表的创建表语法编辑您的解决方案吗?这样的结构需要对我当前的布局进行重大更改,但我愿意尝试这样做。是的,对于未规范化的表,这始终是一个问题,但是对于mysql,您可以编写INSERT I'to SELECT querys,触发器很简单,剩下的工作就是一些工作。rel_cat_media table有2个主键和id列。为什么这里需要id列?它没有在user_roles表中提到id列,这是因为我没有定义外键并将id作为主键与合并索引自动递增,在极少数情况下,我还将关系表引用到另一个表,因此我只有1个bigint可引用。和字段。此外,我不会更快。另一个好处是,当您删除一个分类时,关系表将变为空白,没有错误。您可以使用每个表的create table语法编辑您的解决方案吗?
    | cid | category |
    |---------------|
    | 1  | fashion  |
    |---------------|
    | 2  | sport    |
    |---------------|
    | 3  | cats     |
    |---------------|
    | 4  | dogs     |
    |---------------|
    | 5  | frogs    |
    |_______________|
    
    | id | ref_cid  |  ref_mid |
    |--------------------------|
    | 1  |    1     | 1        |
    |--------------------------|
    | 2  |    3     | 2        |
    |--------------------------|
    | 3  |    2     | 3        | 
    |--------------------------|
    | 4  |    3     | 4        |
    |--------------------------|
    | 5  |    4     | 4        |
    |--------------------------|
    | 6  |    2     | 5        | 
    |__________________________|
    
    CREATE TABLE `media` (
      `mid` BIGINT  AUTO_INCREMENT PRIMARY KEY,
      `etc` datetime DEFAULT NULL,
      `etc` int DEFAULT NULL,
      `etc` varchar(20) NOT NULL 
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
    
    
    CREATE TABLE `category` (
      `cid` BIGINT AUTO_INCREMENT PRIMARY KEY,
      `category`  varchar(20) NOT NULL 
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
    
    CREATE TABLE `rel_cat_media` (
        id BIGINT AUTO_INCREMENT PRIMARY KEY,
        ref_cid BIGINT NOT NULL,
        ref_mid BIGINT NOT NULL,
        INDEX (ref_cid , ref_mid),
        UniQUE (ref_cid , ref_mid)
    );