在工作中遇到了一个这样的问题,:更新一个表中的数据, 但是这个表的数据 是根据 多个表 才能查到, 即通过 select 查询出结果后,在通过查询出的结果 修改 或者添加 数据:
1 基础数据:
1.1z_user 用户表:
DLL语句
-
CREATE TABLE `z_user` (
-
`user_id`
int(
23) NOT NULL AUTO_INCREMENT,
-
`book_id`
int(
23) DEFAULT NULL COMMENT
'书籍ID',
-
`game_id`
int(
23) DEFAULT NULL COMMENT
'游戏ID',
-
`name` varchar(
255) COLLATE utf8mb4_unicode_ci DEFAULT
'' COMMENT
'姓名',
-
PRIMARY KEY (`user_id`)
-
) ENGINE=InnoDB AUTO_INCREMENT=
3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
表内容:
1.2 z_book 书籍表:
DLL语句:
-
CREATE TABLE `z_book` (
-
`book_id`
int(
23) NOT NULL AUTO_INCREMENT COMMENT
'书ID',
-
`book_name` varchar(
255) COLLATE utf8mb4_unicode_ci DEFAULT
'' COMMENT
'书名',
-
PRIMARY KEY (`book_id`)
-
) ENGINE=InnoDB AUTO_INCREMENT=
4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-
表内容:
1.3 z_game 游戏表:
DLL语句:
-
CREATE TABLE `z_game` (
-
`game_id`
int(
11) NOT NULL AUTO_INCREMENT COMMENT
'游戏ID',
-
`game_name` varchar(
255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT
'游戏名称',
-
PRIMARY KEY (`game_id`)
-
) ENGINE=InnoDB AUTO_INCREMENT=
5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
表内容:
1.4 z_test 需要插入或者修改的表:
DLL语句:
-
CREATE TABLE `z_test` (
-
`user_id`
int(
23) NOT NULL,
-
`user_name` varchar(
255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
-
`book_name` varchar(
255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
-
`game_name` varchar(
255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
-
PRIMARY KEY (`user_id`)
-
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
2 根据user_id插入语句:
-
INSERT INTO z_test (
-
user_id,
-
user_name,
-
book_name,
-
game_name
-
)
-
select
-
u.user_id,
-
u.name as user_name,
-
b.book_name,
-
g.game_name
-
from
-
z_user u LEFT JOIN z_book b ON u.book_id = b.book_id
-
LEFT JOIN z_game g ON u.game_id = g.game_id
-
where u.user_id =
1
结果如下:
3 根据ID查询出相关信息后在修改:
将 z_user,z_book,z_game 表中 的name属性名称加上"11"以作区别:
update 语句如下:
-
UPDATE z_test t,z_user u,z_book b,z_game g SET
-
t.user_name = u.name,
-
t.book_name = b.book_name,
-
t.game_name = g.game_name
-
WHERE
1=
1
-
and t.user_id = u.user_id
-
and b.book_id = u.book_id
-
and g.game_id = u.game_id
-
and u.user_id =
1
结果如下:
修改成功!
总结:虽然这个是mysql的基础修改数据,但是还有很多细节需要注意,比如,insert的语句中查询出的字段一定要和需要插入的字段保持一致,不一致的话就使用"as" 用别名使之保持一致,否之无法插入; 在修改的时候,可能会出现 执行成功但是就是没有变化的情况,这时就要仔细看一下,你的条件是否正确, 我遇到的是: 已知user_id 那么 z_user表中 该id下的属性都是知道的, 必须使用 b.book_id = u.book_id 和 g.game_id = u.game_id 才能正确插入的情况, 虽然 用 "="号连接两边都会是相同的,自我感觉右边还得放已知条件才行,我也整的很懵逼,不知为何!