对在mysql中创建表感到困惑

时间:2013-08-16 08:06:15

标签: mysql

我在一年前发现了一个关于stackoverflow的问题,这个问题类似于我在mysql中的数据库结构。问题是here

除了下表之外,提供的答案是有道理的:

Message_type: message_type_id, description (1:public, 2:friends, 3:specific_recipients)

有人可以帮我弄清楚如何创建实现(1:public, 2:friends, 3:specific_recipients)属性的表吗?

修改

User: user_id, given_name, ...

Message: message_id, owner_id (fk User), subject, body, posted, message_type_id (fk Message_type)...

Message_recipients: user_id (fk User), message_id (fk Message)

Message_type: message_type_id, description (1:public, 2:friends, 3:specific_recipients)

所以我尝试基于此实现我的数据库,但是我在设置它时遇到了问题。 第一个问题:message表格中有一个名为FK的{​​{1}},但如果您查看之前的OP问题,该字段将被称为message_type_id,而不是{{1} }}。如何在不删除其记录的情况下将isPublic字段更改为PK。在创建这些表时,我还需要指定任何isPublicFK条件。

1 个答案:

答案 0 :(得分:0)

我认为Message_type有两列message_type_iddescription,并且包含3行,其中包含括号中的值,如下所示:

message_type_id | description
----------------+--------------------
1               | public
2               | friends
3               | specific_recipients

有几种方法可以编写SQL来实现这一点,一种方式(使用message_type_id作为主键):

CREATE TABLE Message_type (message_type_id INT NOT NULL PRIMARY KEY,
                           description VARCHAR(100))
SELECT 1 AS message_type_id, 'public' AS description
UNION ALL
SELECT 2, 'friends'
UNION ALL
SELECT 3, 'specific_recipients'

有关详情,请参阅this

或者:

CREATE TABLE Message_type (message_type_id INT NOT NULL PRIMARY KEY,
                           description VARCHAR(100));

INSERT INTO message_type
VALUES (1, 'public'), (2, 'friends'), (3, 'specific_recipients')

编辑问题编辑:

如果您已使用(例如):

创建了Message
CREATE TABLE Message (
  message_id int(10) unsigned NOT NULL auto_increment,
  isPublic tinyint(4) default '0',
  PRIMARY KEY (message_id)
);

这会用isPublic替换(大概是布尔)message_type_id

ALTER TABLE Message
ADD COLUMN message_type_id INT REFERENCES Message_type(message_type_id);

# classified everything that's not public as friends
UPDATE Message
SET message_type_id = CASE WHEN isPublic = 1 THEN 1
                           ELSE 2
                      END;

ALTER TABLE Message DROP COLUMN isPublic;