我在一年前发现了一个关于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
。在创建这些表时,我还需要指定任何isPublic
或FK
条件。
答案 0 :(得分:0)
我认为Message_type
有两列message_type_id
和description
,并且包含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;