添加行(如果不存在),或检索其ID以进行其他查询

时间:2014-05-15 14:02:45

标签: mysql

这个问题混合了已经回答的几个问题,但我不能将所有答案放在一起以使其有效。

我有三张桌子:

users

| user_id | user_name |

events

| event_id | event_date | event_name |

user_event

| user_id | event_id |

user_event 是前面表中的子项,并将用户与事件相关联(将外键定义到其父表,ON DELETE CASCADE)。

每个用户都可以添加一个活动,但如果该活动已经存在,则不会在表格 events 中创建副本,但仍会在<已保存事件user_event现有 user_id的强> event_id

代码我只需要添加一个事件,如果事件尚未存在:

INSERT INTO `events` (`event_id`, `event_date`, `event_name`) 
SELECT * FROM (SELECT 'event_1', '2014-05-20',  'Meeting') AS tmp 
WHERE NOT EXISTS (
    SELECT `event_id`, `event_date`, `event_name` 
    FROM `events` 
    WHERE `event_name` = 'Meeting' 
    AND `event_date` = '2014-05-20') 
LIMIT 1;

然后我想将它保存到user_event表中,以便我知道此用户将参加此事件:

INSERT INTO `user_event` (`user_id`, `event_id`) VALUES ('user_1', 'event_1');

如果它是一个新事件,一切都很好,因为我事先知道事件ID但是如果另一个用户正在创建一个已经存在的事件:

user_2创建以下事件(与之前插入的相同,但ID不同):

`event_name` = 'Meeting'
`event_date` = '2014-05-20'
`event_id` = 'event_2'

我想在表user_event中插入以下条目:

| user_2 | event_1 |

也许可以将这些查询组合成一个和用户的sql变量,或者可以通过定义id = last_insert_id(id)并在提交第二个查询之前通过php检索它,但不能使它工作。

1 个答案:

答案 0 :(得分:0)

event_id列是自动增量吗?

如果你把它放在插入查询的末尾,它会给你一个php的last_insert_id()值,即使事件中有重复值。然后,您可以使用它插入用户事件。

ON DUPLICATE KEY UPDATE event_id = LAST_INSERT_ID(event_id)

您必须在mysql表中为唯一列(event_name)创建一个唯一键才能使其生效。