【问题标题】:Multi valued attributes in a table表中的多值属性
【发布时间】:2013-10-21 06:41:07
【问题描述】:

我设计了一个发送消息系统,用户可以在其中一次向多个人发送消息。所以消息的接收者属性是多值的。所以我设计了另一个名为 message_recipients 的表。

这是我的桌子:

create table `message`(
`message_id`           INT(11)      NOT NULL primary key auto_increment,
`sender`               VARCHAR(32)  NOT NULL,
`topic`                VARCHAR(100) NOT NULL,
`content`              TEXT         NOT NULL,
`message_date`         TIMESTAMP    NOT NULL  ,
`readed`               VARCHAR(1)   NOT NULL DEFAULT 0,
`deleted_by_sender`    VARCHAR(1)   NOT NULL DEFAULT 0,
`deleted_by_recipient` VARCHAR(1)   NOT NULL DEFAULT 0,
FOREIGN KEY(sender)    REFERENCES   users(user_name)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;


create table `message_recipients`(
`message_id` INT         NOT NULL ,
`recipient`  VARCHAR(32) NOT NULL ,
PRIMARY KEY(message_id,recipient),
FOREIGN KEY(message_id) REFERENCES message(message_id) on delete cascade,
FOREIGN KEY(recipient)  REFERENCES users(user_name)
)ENGINE=InnoDB default charset=utf8;

当我在message 表中插入一条消息时,我需要获取它的message_id 并将其与收件人或收件人一起插入message_recipients 表中。

这是我的脚本:

insert into `message`(`sender`,`topic`,`content`)
values('me','need help','how to get last inserted row');
select message_id from `message` order by `message_id` desc limit 0,1;

当我得到message_id 时,我现在可以将它插入message_recipients 并以一些用户为收件人,现在的问题是;有没有更好或更优化的方法?

【问题讨论】:

  • 不要将varchar 用于标志字段。根据您的版本使用bittinyint。您可能还想使用unsigned id 列

标签: mysql sql


【解决方案1】:

使用函数 mysql_insert_id() 代替

select message_id from `message` order by `message_id` limit 0,1;

这是一个内置的 MySQL 方法,它将为您获取刚刚插入的主键。如果有大量同时插入,上面的 SELECT 语句可能不可靠。

【讨论】:

  • 我不认为他们会在该会话中获得正确最后一个message_id
  • :) 你复制了我的脚本 :) 好的,我该怎么办?有没有更好的办法?
  • 如果您使用单个 INSERT 语句插入多行,LAST_INSERT_ID() 仅返回为第一个插入行生成的值。这样做的原因是可以轻松地针对其他服务器重现相同的 INSERT 语句。 dev.mysql.com/doc/refman/5.0/en/information-functions.html
猜你喜欢
  • 2014-06-30
  • 1970-01-01
  • 1970-01-01
  • 2011-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-10
  • 2017-08-31
相关资源
最近更新 更多