Цикл SQL с внешним ключом

Я пытаюсь создать кучу кодов скидок. Они имеют ограничения внешнего ключа.

На данный момент у меня есть

INSERT INTO code (title, code, desc) VALUES ('code1','XPISY9','test code');
INSERT INTO code_details (code_id, used, attempts) VALUES (
 SELECT code_id from code where code = 'XPISY9',0,0);

code_id в code_details является внешним ключом для code_id в кодовой таблице.

Как лучше всего создать цикл, в котором я могу сгенерировать набор этих значений (около 100). Мне нужно, чтобы код был не повторяющимся случайным значением.

Любая помощь будет оценена по достоинству.

Благодарность


person nad    schedule 27.02.2014    source источник
comment
Поскольку SQL является декларативным языком, а не императивным, попытка создать цикл, который генерирует что-то в SQL, не является хорошим подходом. Вместо этого вы должны попытаться выразить все нужные вам коды, выбрав их откуда-то, выполнив какое-то условие.   -  person Alex Jurado - Bitendian    schedule 27.02.2014


Ответы (2)


Когда у вас будет 100 или около того записей в таблице кодов, вы можете добавить детали кода в один оператор:

INSERT INTO code_details (code_id, used, attempts) 
SELECT code, 0, 0
FROM code;

Во-первых, создание записей кода — это другой вопрос, и, вероятно, лучше всего это сделать с помощью какого-либо другого инструмента для создания 100 операторов вставки в текстовый файл, который затем можно выполнить.

Я видел, как это делается со всеми возможными языками сценариев — выберите свой любимый. Я даже видел, как Excel использовался со столбцом для идентификатора и строковой формулы для создания операторов вставки.

person Owen    schedule 27.02.2014

Спасибо за помощь, ребята! Я решил составить для этого процедуру, и она отлично сработала:

DELIMITER $$
CREATE PROCEDURE vouchergen(IN length INT(10) ,IN duration VARCHAR(20),IN sponsor VARCHAR(20),IN amount INT(10))
BEGIN

DECLARE i INT DEFAULT 1;

WHILE (i< amount) DO

SET @vcode= CONCAT(BINARY brand , UPPER(SUBSTRING(MD5(RAND()) FROM 1 FOR 6)));

INSERT INTO code (title, code, desc) VALUES (CONCAT(brand,i),@vcode,CONCAT(length,' ',duration));

INSERT INTO code_details (code_id, used, attempts) VALUES (
 SELECT code_id from code where code = @vcode,0,0);

SET i=i+1;

END WHILE;
END$$;

Затем я могу вызвать это для gen, сколько захочу:

CALL vouchergen(1,'week',APPL,400);
CALL vouchergen(1,'month',APPL,100);
CALL vouchergen(1,'day',APPL,200);
person nad    schedule 28.02.2014