【问题标题】:MySQL: Grouped primary key with InnoDBMySQL:使用 InnoDB 分组主键
【发布时间】:2012-07-04 09:05:05
【问题描述】:

是否有等效于使用 InnoDB MySQL 数据库并允许在第二个键上自动递增的分组主键?

我要实现的是一个基于父对象 ID 存储图像 URL 的表,例如:

CREATE TABLE images (
   parent_id INT(11) NOT NULL,
   image_id INT(11) AUTO_INCREMENT, //will this work with a grouped primary key?
   source_url VARCHAR(255) NOT NULL,
   caption VARCHAR(255) NOT NULL,
) ENGINE = InnoDB;

所以对于 MyISAM,我可以这样做:

PRIMARY KEY(parent_id, image_id)

[edit] 使用触发器类似于:(对不起,我的 SQL 不是很强大)

delimiter //
DROP TRIGGER IF EXISTS test_img_trigger;
CREATE TRIGGER test_img_trigger BEFORE INSERT ON venue_images
FOR EACH ROW
BEGIN
DECLARE img_id INT UNSIGNED DEFAULT 0;

SELECT image_id + 1 INTO img_id FROM venue_images WHERE venue_id = NEW.venue_id;
UPDATE venue_images SET image_id = img_id WHERE venue_id = NEW.venue_id;

END IF;
END;//
delimiter;

【问题讨论】:

  • 为分组列设置键而不是主键

标签: mysql


【解决方案1】:

只能有一个自动列,并且必须定义为key。检查这个


CREATE TABLE images (
   parent_id INT(11) NOT NULL,
   image_id INT(11) Not Null  AUTO_INCREMENT, 
   source_url VARCHAR(255) NOT NULL,
   caption VARCHAR(255) NOT NULL,

   key(image_id),                          -- add as a key       
   PRIMARY KEY(parent_id, image_id)
) ENGINE = InnoDB;

【讨论】:

  • 谢谢,这确实有效,但我希望 image_id 字段仅相对于 parent_id 自动递增,这样每个 parent_id 都会有许多从 1 开始的 image_id。
  • 那么您需要创建自己的自定义functiontrigger 来执行此操作。
  • 我在原始帖子中添加的内容是否足够?
【解决方案2】:

如果这可以帮助其他人,这是我的解决方案。

我不能简单地使用触发器,因为 MySQL 尚不(或至少我的 5.1.53 版本)支持使用触发器来更新调用触发器的表的能力。于是我创建了一个序列表:

CREATE TABLE image_seq (
    parent_id INT(11) NOT NULL,
    catagory INT(11) NOT NULL,
    next_seq_id INT(11) NOT NULL,
    KEY(catagory),
    PRIMARY KEY(parent_id, catagory);
);

然后在 images 表上创建触发器:

CREATE TRIGGER bi_image_trig
BEFORE INSERT ON images
FOR EACH ROW
BEGIN

DECLARE id INT UNSIGNED DEFAULT 1;
 SELECT next_seq_id + 1 INTO id FROM image_seq WHERE parent_id=NEW.parent_id AND       catagory=NEW.catagory;
SET NEW.image_id = id;
UPDATE image_seq SET next_seq_id=id WHERE parent_id=NEW.parent_id AND catagory=NEW.catagory;

END;

不确定它是否是最佳解决方案,但它可以工作,并允许我跟踪每个父对象的类别中的图像编号。

【讨论】:

    猜你喜欢
    • 2011-04-05
    • 2013-04-30
    • 1970-01-01
    • 2021-04-29
    • 2016-11-08
    • 2012-12-14
    • 2010-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多