MySQL:使用InnoDB分组主键

时间:2012-07-03 03:45:24

标签: mysql

是否有使用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;

2 个答案:

答案 0 :(得分:0)

只能有一个自动列,必须将其定义为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;

答案 1 :(得分:0)

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

我不能简单地使用触发器,因为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);
);

然后在图像表上创建了一个触发器:

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;

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