2012-07-03 3 views
1

Является ли эквивалент сгруппированным первичным ключом с использованием базы данных InnoDB MySQL и позволяет автоинкремент на втором ключе?MySQL: сгруппированный первичный ключ с InnoDB

То, что я пытаюсь выполнить это таблица для хранения изображений URL, на основе родительского объекта ID что-то вроде:

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

Сделать ключ для столбцов сгруппированы вместо первичного ключа – diEcho

ответ

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; 

Не уверен, если ее оптимальное решение, но оно работает и позволяет мне следить за номерами изображения в категориях для каждого родительского объекта.

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; 
+0

Спасибо, это действительно работает, но я хочу, чтобы поле image_id автоматически увеличивалось только по отношению к parent_id, так что каждый родительский_ид будет иметь множество изображений image_id начиная с 1. – adamK

+0

то вам нужно создать свою собственную 'функцию' или' триггер' для этого. –

+0

Является ли то, что я добавил в исходное сообщение, что может быть достаточно? – adamK

Смежные вопросы