是否有使用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;
答案 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中的图像编号。