将mysql中的一行替换为两行
在mysql中,如何用5行数据替换一行。例如,我有这个表将mysql中的一行替换为两行,mysql,sql,Mysql,Sql,在mysql中,如何用5行数据替换一行。例如,我有这个表 id | companyId | name | open | close 1 | 1 | mon-fri | 10:00 | 19:00 2 | 1 | sat | 10:00 | 12:00 3 | 1 | sun | 1
id | companyId | name | open | close
1 | 1 | mon-fri | 10:00 | 19:00
2 | 1 | sat | 10:00 | 12:00
3 | 1 | sun | 10:00 | 12:00
4 | 2 | mon-fri | 10:00 | 16:00
5 | 2 | sat | 10:00 | 13:00
6 | 2 | sun | 10:00 | 13:00
我想将mon-fri的名称字段转换为mon、tues、wed、thur、fri
id | companyId | name | open | close
1 | 1 | mon | 10:00 | 19:00
2 | 1 | tues | 10:00 | 19:00
3 | 1 | wed | 10:00 | 19:00
4 | 1 | thur | 10:00 | 19:00
5 | 1 | fri | 10:00 | 19:00
6 | 1 | sat | 10:00 | 12:00
7 | 1 | sun | 10:00 | 12:00
.
.
.
您不能通过
更新,但您可以做的是将一系列插入到。。。选择
使用一些字符串文字,然后选择
删除
,以删除展开的行
/* First insert a row for each mon,tue,wed,thur,fri */
/* Column values are copied from the existing mon-fri row, and use the literal strings 'mon', 'tue', etc as the new `name` */
INSERT INTO yourtable (`companyId`, `name`, `open`, `close`)
SELECT `companyId`, 'mon', `open`, `close` FROM yourtable WHERE `name` = 'mon-fri'
INSERT INTO yourtable (`companyId`, `name`, `open`, `close`)
SELECT `companyId`, 'tue', `open`, `close` FROM yourtable WHERE `name` = 'mon-fri'
INSERT INTO yourtable (`companyId`, `name`, `open`, `close`)
SELECT `companyId`, 'wed', `open`, `close` FROM yourtable WHERE `name` = 'mon-fri'
INSERT INTO yourtable (`companyId`, `name`, `open`, `close`)
SELECT `companyId`, 'thur', `open`, `close` FROM yourtable WHERE `name` = 'mon-fri'
INSERT INTO yourtable (`companyId`, `name`, `open`, `close`)
SELECT `companyId`, 'fri', `open`, `close` FROM yourtable WHERE `name` = 'mon-fri'
/* Then delete the original mon-fri rows which you just expanded out */
DELETE FROM yourtable WHERE `name` = 'mon-fri'
(应得的荣誉:这一极好的建议是作者在未经请求的编辑中提出的)
您还可以通过使用虚拟表来减少语句的数量以及表扫描的数量,如下所示:
/* Cross-join the existing 'mon-fri' rows with a virtual table of day names
of 'mon' through 'fri' and insert the resulting set back into your table */
INSERT INTO yourtable (`companyId`, `name`, `open`, `close`)
SELECT t.`companyId`, v.`name`, t.`open`, t.`close`
FROM yourtable t
CROSS JOIN (
SELECT 'mon' AS `name` UNION ALL
SELECT 'tue' UNION ALL
SELECT 'wed' UNION ALL
SELECT 'thur' UNION ALL
SELECT 'fri'
) v
WHERE t.`name` = 'mon-fri';
/* Then delete the original mon-fri rows which you just expanded out */
DELETE FROM yourtable WHERE `name` = 'mon-fri';
评论后更新:
插入行时强制执行它们的顺序没有实际价值,最好在SELECT
中执行
要按天为每个公司ID
订购,无论采用哪种方式,都需要做一些工作。您可以使用%a
调用LOWER(STR_TO_DATE())
并比较工作日值,但是您还需要将thur
更改为thu
,因为MySQL就是这样缩写的。这会导致一系列函数调用
相反,您可以使用排序依据
中的CASE…
为每天分配序号值,如:
ORDER BY
companyId,
CASE `name`
WHEN 'sun' THEN 1
WHEN 'mon' THEN 2
WHEN 'tue' THEN 3
WHEN 'wed' THEN 4
WHEN 'thur' THEN 5
WHEN 'fri' THEN 6
WHEN 'sat' THEN 7
ELSE 8 END
不过,上述两种方法对索引都不友好。
如果您需要更高的性能,我建议首先不要存储字符串
'mon'、'tue'、'wed'
等,而是存储它们相关的工作日值。有关详细信息,请参阅 您不能通过更新来执行此操作,但您可以执行的是一系列插入到。。。选择
使用一些字符串文字,然后选择
删除,以删除展开的行
/* First insert a row for each mon,tue,wed,thur,fri */
/* Column values are copied from the existing mon-fri row, and use the literal strings 'mon', 'tue', etc as the new `name` */
INSERT INTO yourtable (`companyId`, `name`, `open`, `close`)
SELECT `companyId`, 'mon', `open`, `close` FROM yourtable WHERE `name` = 'mon-fri'
INSERT INTO yourtable (`companyId`, `name`, `open`, `close`)
SELECT `companyId`, 'tue', `open`, `close` FROM yourtable WHERE `name` = 'mon-fri'
INSERT INTO yourtable (`companyId`, `name`, `open`, `close`)
SELECT `companyId`, 'wed', `open`, `close` FROM yourtable WHERE `name` = 'mon-fri'
INSERT INTO yourtable (`companyId`, `name`, `open`, `close`)
SELECT `companyId`, 'thur', `open`, `close` FROM yourtable WHERE `name` = 'mon-fri'
INSERT INTO yourtable (`companyId`, `name`, `open`, `close`)
SELECT `companyId`, 'fri', `open`, `close` FROM yourtable WHERE `name` = 'mon-fri'
/* Then delete the original mon-fri rows which you just expanded out */
DELETE FROM yourtable WHERE `name` = 'mon-fri'
(应得的荣誉:这一极好的建议是作者在未经请求的编辑中提出的)
您还可以通过使用虚拟表来减少语句的数量以及表扫描的数量,如下所示:
/* Cross-join the existing 'mon-fri' rows with a virtual table of day names
of 'mon' through 'fri' and insert the resulting set back into your table */
INSERT INTO yourtable (`companyId`, `name`, `open`, `close`)
SELECT t.`companyId`, v.`name`, t.`open`, t.`close`
FROM yourtable t
CROSS JOIN (
SELECT 'mon' AS `name` UNION ALL
SELECT 'tue' UNION ALL
SELECT 'wed' UNION ALL
SELECT 'thur' UNION ALL
SELECT 'fri'
) v
WHERE t.`name` = 'mon-fri';
/* Then delete the original mon-fri rows which you just expanded out */
DELETE FROM yourtable WHERE `name` = 'mon-fri';
评论后更新:
插入行时强制执行它们的顺序没有实际价值,最好在SELECT
中执行
要按天为每个公司ID
订购,无论采用哪种方式,都需要做一些工作。您可以使用%a
调用LOWER(STR_TO_DATE())
并比较工作日值,但是您还需要将thur
更改为thu
,因为MySQL就是这样缩写的。这会导致一系列函数调用
相反,您可以使用排序依据
中的CASE…
为每天分配序号值,如:
ORDER BY
companyId,
CASE `name`
WHEN 'sun' THEN 1
WHEN 'mon' THEN 2
WHEN 'tue' THEN 3
WHEN 'wed' THEN 4
WHEN 'thur' THEN 5
WHEN 'fri' THEN 6
WHEN 'sat' THEN 7
ELSE 8 END
不过,上述两种方法对索引都不友好。
如果您需要更高的性能,我建议首先不要存储字符串
'mon'、'tue'、'wed'
等,而是存储它们相关的工作日值。有关详细信息,请参阅 有很多……那太好了,但我怎么能像周一、周二、周三、周四、周五、周六、周日那样点餐呢。对所有公司都是这样。@AndriyM超级建议。有很多……那太好了,但我怎么能像周一、周二、周三、周四、周五、周六、周日那样订购呢。所有公司都可以。@AndriyM超级建议。