2017-06-16 37 views
1

我对MySQL非常陌生,并且为此迈出了第一步。我现在所拥有的2个表看起来像这样:MySQL为表添加动态数量

事件:

+-------+-------------+ 
| Field | Type  | 
+-------+-------------+ 
| id | int(11)  | 
| name | varchar(30) | 
| date | datetime | 
+-------+-------------+ 

用户:

+----------+-------------+ 
| Field | Type  | 
+----------+-------------+ 
| name  | varchar(30) | 
| amount | int   | 
+----------+-------------+ 

现在我想能够给用户的添加动态量事件但我不知道我应该如何创建一个动态表,否则我应该实现这样的行为。最佳做法是什么?

帮助将不胜感激。

+0

你可能想看看桌子上的关系。有不同类型的关系(一个属于其他很多属于其他许多项目的项目,例如拥有评论的用户以及许多用户访问过许多用户访问过许多帖子的帖子)。一个非常有用的教程是这里:https://code.tutsplus.com/articles/sql-for-beginners-part-3-database-relationships--net-8561 – Gegenwind

回答

3

这是一个经典的多对多关系。您可以通过添加新表

event_users table 
----------------- 
event_id 
user_id 

对于事件处理它(ID = 1),具有两个用户(ID = 3,4),它看起来像这样

event_id | user_id 
1  | 3 
1  | 4 

要获得的所有用户事件中,你会做这个

select u.name 
from users u 
join event_users eu on eu.user_id = u.id 
join events e on eu.event_id = e.id 
where e.name = 'my event' 
+0

非常感谢您的帮助。我甚至不知道这是一个多对多的关系。我一定会阅读更多不同类型的那些。 –

2

您需要第三个表,表:

create table UserEvents (
    UserEventId int auto_increment primary key, 
    UserId int, 
    EventId int, 
    constraint fk_userevents_userid foreign key (UserId) references Users(id), 
    constraint fk_userevents_eventid foreign key (EventId) references Events(id) 
); 

注:

  • 我的名字在多个表。
  • 该表的id是单数,其次是“ID”(所以我更喜欢Users(UserId)Events(EventId)
  • 这已申报的外键关系。
  • 如果重复是不允许的,那么你还需要一个唯一约束在(UserId, EventId)
+0

感谢您提供快速解答和注释。对于像我这样的初学者来说,这些都是一些好的提示。 –

+0

请注意'constraint .... foreign key .... references ....'只适用于defualt引擎是InnoDB时...如果defualt引擎不是InnoDB,则需要将'engine = InnoDB'添加到create table语句。 –

1

为此,您应该使用第三个表中,你应该保持活动和相关的用户ID。

user_event

id user_id event_id created_date 

USER_ID和事项标识是此表的外键和指向的用户和事件表的主键分别