2

我发现一年多前在 stackoverflow 上提出的一个问题类似于我在 mysql 中的数据库结构。问题可以在这里找到

除了下表之外,已提供的答案是有意义的:

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被调用的message_type_id但如果你查看之前的 OP 的问题,该字段被调用isPublic并且不是一个PK. 如何在不删除其记录的情况下将isPublic字段更改为 a 。FK我还需要在创建这些表时指定任何UPDATES或条件。ALTER

4

1 回答 1

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'

有关更多信息,请参阅

或者:

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;
于 2013-08-16T08:10:53.263 回答