我有桌子时间表。
CREATE TABLE Schedule (
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
Program VARCHAR(30) NOT NULL,
Time DATETIME NOT NULL)
有一天会有很多节目,例如:
周一
.....
星期二
.....
直到周日。
我想每天触发,它会检查下周那天是否有数据。所以在星期一14/09/2015将检查下一个星期一21/09/2015。如果当天没有数据,它将在上一个星期一插入数据副本。
也许逻辑或伪代码就像这样
IF (Current date + 7 days IS NULL)
Then
INSERT INTO SCHEDULE (program, time)
VALUES ( (Select Program FROM SCHEDULE Where Day(Sysdate()) = Day(Time)),
(select Time FROM SCHEDULE Where Day(sysdate()=Day(Time))+7 Day) )
我的问题是我不知道在同一时间插入今天程序副本的正确查询(HH:MM)但不同的Date.BTW我正在使用php MyAdmin事件
答案 0 :(得分:1)
考虑以下
-- drop table Schedule;
create table Schedule
( id int auto_increment primary key,
theDate datetime not null, -- sorry, stay away from KEYWORDS and RESERVED WORD
Program VARCHAR(30) NOT NULL,
counterDemo int not null,
unique key(theDate,Program) -- prevents duplicates at the combo-level
);
-- truncate table Schedule;
-- note I am skipping the time part of the date below
insert Schedule(theDate,Program,counterDemo) values
('2015-09-15','ProgramA',1),
('2015-09-15','ProgramB',1),
('2015-09-16','ProgramA',1),
('2015-09-16','ProgramB',1);
- 根据日期(可能是本周)在下周为所有节目插入一行
-- without aliases, we seem to get the 1052 error: Ambiguous error
insert into Schedule(theDate,Program,counterDemo)
select date_add(t2.theDate,interval 1 week),t2.Program,1 from Schedule t2 where t2.theDate='2015-09-15'
on duplicate key update Schedule.counterDemo=Schedule.counterDemo+1;
select * from schedule;
+----+---------------------+----------+-------------+
| id | theDate | Program | counterDemo |
+----+---------------------+----------+-------------+
| 1 | 2015-09-15 00:00:00 | ProgramA | 1 |
| 2 | 2015-09-15 00:00:00 | ProgramB | 1 |
| 3 | 2015-09-16 00:00:00 | ProgramA | 1 |
| 4 | 2015-09-16 00:00:00 | ProgramB | 1 |
| 5 | 2015-09-22 00:00:00 | ProgramA | 1 |
| 6 | 2015-09-22 00:00:00 | ProgramB | 1 |
+----+---------------------+----------+-------------+
insert into Schedule(theDate,Program,counterDemo)
select date_add(t2.theDate,interval 1 week),t2.Program,1 from Schedule t2 where t2.theDate='2015-09-15'
on duplicate key update Schedule.counterDemo=Schedule.counterDemo+1;
select * from schedule;
+----+---------------------+----------+-------------+
| id | theDate | Program | counterDemo |
+----+---------------------+----------+-------------+
| 1 | 2015-09-15 00:00:00 | ProgramA | 1 |
| 2 | 2015-09-15 00:00:00 | ProgramB | 1 |
| 3 | 2015-09-16 00:00:00 | ProgramA | 1 |
| 4 | 2015-09-16 00:00:00 | ProgramB | 1 |
| 5 | 2015-09-22 00:00:00 | ProgramA | 2 |
| 6 | 2015-09-22 00:00:00 | ProgramB | 2 |
+----+---------------------+----------+-------------+
这利用了insert on duplicate key update
功能的mysql功能。请参见手册页here。如果要插入的行已存在,则进行更新。这就是我展示counterDemo专栏的原因。这样,没有重复的数据。 counterDemo只是一个视觉效果。
unique key(theDate,Program)
底部的create table
是让它发挥作用的原因。当mysql根据它看到重复时,它会强制更新(而不是插入)。请再次注意上一段中手册页的链接。
date_add的另一个手册页也是如此。
立即吞下很多东西,但它可以保持您的数据清洁。您需要将此工作添加到使用phpmyadmin创建的事件中。
有关Create Event的详细示例,请参阅我写的here。我已经做了一些,还有其他更好的,我相信其他人。