1

是否有等效于使用 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)

[编辑] 使用触发器会是这样的:(对不起,我的 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;
4

2 回答 2

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);
);

然后在 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;

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

于 2012-07-04T01:05:05.903 回答
0

只能有一个 auto 列,并且必须定义为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;
于 2012-07-03T04:26:14.940 回答