LINUX.ORG.RU

[mysql] create table on insert

 


0

1

Всем привет.

Есть таблица (items), в которую методом INSERT добавляются элементы. Можно ли средствами SQL обеспечить создание связанной таблицы для каждого вновь создаваемого элемента с идентификатором items.id? То есть, необходимо, чтобы по событию INSERT таблицы items создавалась таблица с динамическим именем properties_for_{id}, где id - идентификатор из таблицы items.

Я пробовал использовать для этого триггеры, но всё упёрлось в невозможность применения в них динамических конструкций (в том числе в хранимых процедурах, вызываемых из триггеров).

Есть ли какой-нибудь способ решения, или создание таблиц нужно выносить из базы в клиентское приложение?...

Заранее благодарю.

★★

Зачем создавать таблицу для каждой записи?

Не проще ли сделать это через стандартное соотношение один-ко-многим?

В самом примитивном виде будет выглядеть примерно так:

create table properties (
    id int not null auto_increment primary key,
    item_id int,
    name varchar(xxx),
    val varchar(xxx)
)

Эта реализация, естественно, во многом ограничена, - возможны варианты в зависимости от конкретных требований.

shylent
()
Ответ на: комментарий от shylent

Мне не подходит. Нужно для каждой строки таблицы items вести что-то типа истории изменений, т.е. одним свойством тут не ограничишься — нужно что-то расширяемое, например таблица ;)

i82 ★★
() автор топика
Ответ на: комментарий от i82

shylent как раз и подсказал расширяемое.. Почему не создавать новые свойства ваших объектов по требованию?

Раз уж нужна история, добавьте поле date..

Bad_Habit
()

Определитесь с набором сущностей. Элементы, Свойства элементов, Изменения свойств элементов. Потом рисуете ER-диаграмму, из которой ясно вытекает стройная и логичная структура из нескольких таблиц, связанных ключами. Динамическое создание таблиц противоречит духу SQL и это костыль!

amomymous ★★★
()
Ответ на: комментарий от i82

Почему не подходит? Если нужно хранить версии строк, содержащихся, скажем в таблице 'items', все равно получается такое соотношение: одна строка таблицы 'items' к N 'ревизиям' этой строки, т.е. все также один-ко-многим.

Можно что-то в таком роде попробовать:

create table item (
    id int not null auto_increment primary key,
    f1..
    fN
)

create table item_revision (
    id int not null auto_increment primary key,
    item_id int not null,
    rev int not null,
    f1..
    fN,
    unique ind_rev_item (item_id, rev),
)

Где f1-fN - поля, описывающие сущность 'item'. Rev - номер ревизии.

Можно, в принципе, одной таблицей обойтись, если очень хочется.

shylent
()
Ответ на: комментарий от xorik

Спасибо за ссылку, почитал. Всё понятно, учту в дальнейшем. Единственное, что могу сказать по поводу предпосылок возникшего у меня вопроса, так это то, что в своём решении я хотел максимально упростить количество и структуру запросов к БД. В предлагаемых же решениях, в силу использования всяких «хитростей» и идеологических моментов типа «духа SQL», обязательно придётся строить сложные (в смысле большие) запросы. Ну где-то так...

i82 ★★
() автор топика

DDL запрещено делать в DML.

Deleted
()
Ответ на: комментарий от i82

> что в своём решении я хотел максимально упростить количество и структуру запросов

по таблице на каждую запись? это /0

силу использования всяких «хитростей» и идеологических моментов типа «духа SQL»

не надо ереси. ты пытаешся своё невежество выдать за оптимизацию. тебе подсказали как правильно делать.

Anoxemian ★★★★★
()
Ответ на: комментарий от aydar

Наверное соглашусь, т.к. не силён во внутренностях СУБД.

i82 ★★
() автор топика
Ответ на: комментарий от Anoxemian

> не надо ереси. ты пытаешся своё невежество выдать за оптимизацию. тебе подсказали как правильно делать.

Да, именно так. Мой опыт ограничен... Спасибо за подсказки ;)

i82 ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.