使用phpMyAdmin中的事件自动插入MySQL

时间:2015-09-15 05:10:12

标签: mysql date phpmyadmin

我有桌子时间表。

CREATE TABLE Schedule (
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
Program VARCHAR(30) NOT NULL,
Time DATETIME NOT NULL)

有一天会有很多节目,例如:

周一

  1. 程序x || 17:00
  2. 程序y || 18:00
  3. .....

    星期二

    1. 编程|| 10:00
    2. 计划b || 12:00
    3. .....

      直到周日。

      我想每天触发,它会检查下周那天是否有数据。所以在星期一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事件enter image description here

1 个答案:

答案 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。我已经做了一些,还有其他更好的,我相信其他人。