Mysql更新多行
我有两张桌子类别表中的“媒体id”引用了媒体表中的“id”。媒体表中的每个项目都可以有类别表中的零个或多个类别 媒体表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 | category | media_id |
|--------------------------|
| 1 | fashion | 1 |
|--------------------------|
| 2 | sport | 2 |
|--------------------------|
| 3 | sport | 3 |
|--------------------------|
| 4 | cats | 4 |
|--------------------------|
| 5 | dogs | 4 |
|--------------------------|
| 6 | sport | 5 |
|__________________________|
当我在表中保存数据时,我想更新类别。我以前的方式是:
对于每种媒体:
如何改进更新类别表的过程?您需要三个表和一些重新编程 第一张表:
媒体(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)
);