Основываясь на том, что вы говорите, похоже, что это главная цель:
Держите колонку против в таблице my_eav синхронизированный с в заголовке в колонке сообщений таблицы.
Если это так, моя первая мысль была бы, что вы могли бы нормализовать базу данных, просто хранить название в posts
только, и если вам нужен заголовок, просто получить его всякий раз, когда вы запрашиваете my_eav
с объединением:
select * from my_eav inner join posts on my_eav.v_link = posts.id
where my_ev.id = <my desired record>
Однако это вполне возможно с помощью триггеров.
Вы не включили дизайн posts
таблицы, но это звучит, как будто это что-то вроде этого:
CREATE TABLE posts(id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT);
Так давайте вставить пару пробных записей там:
insert into posts (title) values('Romeo & Juliet');
insert into posts (title) values('Hamlet');
Что дает us a table like this:
--------------------
|id |title |
--------------------
| 1 |Romeo & Juliet |
| 2 |Hamlet |
--------------------
Теперь давайте создадим my_eav
таблица с внешним ключом (на данный момент я оставил уникальное ограничение, поэтому мы можем сосредоточиться на триггерах).
CREATE TABLE my_eav(id INTEGER PRIMARY KEY AUTOINCREMENT, k TEXT NOT NULL, v TEXT,
v_link INTEGER, FOREIGN KEY(v_link) REFERENCES posts(id));
Так что теперь пустой my_eav
таблица выглядит следующим образом:
-------------------
|id|k |v |v_link |
-------------------
-------------------
Давайте проверим внешний ключ, чтобы убедиться, что она не позволяет записи в my_eav
, если они не существуют в posts
(с моей SQLITE например Я должен был использовать команду ргадта, чтобы заставить SQLite в честь внешнего ключа):
pragma foreign_keys=on;
insert into my_eav(k, v_link) values('test', 3);
Error: FOREIGN KEY constraint failed
Так что это хорошо, мы не можем вставить запись в my_eav
, если она не существует в posts
.
Чтобы сохранить титул синхронизированного между двумя таблицами, мы будем нуждаться в два триггеров, а не только один: триггер на my_eav
когда запись первой создана, а также триггер posts
, когда заголовок изменяются там.
Вот триггер на my_eav
, чтобы захватить титул, когда запись первого вставлено:
CREATE TRIGGER get_title AFTER INSERT ON my_eav
BEGIN
UPDATE my_eav SET v = (select title from posts where posts.id = v_link);
END;
Если мы протестируем его, добавив запись:
insert into my_eav(k, v_link) values('test1', 1);
Он захватывает титул, как это предполагалось чтобы:
-------------------------------
|id|k |v |v_link|
-------------------------------
|1 |test1|Romeo & Juliet|1 |
-------------------------------
Другая рекомендация:
insert into my_eav(k, v_link) values('test2', 1);
таблица в настоящее время:
-------------------------------
|id|k |v |v_link|
-------------------------------
|1 |test1|Romeo & Juliet|1 |
|2 |test2|Romeo & Juliet|1 |
-------------------------------
и еще один:
insert into my_eav(k, v_link) values('test3', 2);
таблица в настоящее время:
-------------------------------
|id|k |v |v_link|
-------------------------------
|1 |test1|Romeo & Juliet|1 |
|2 |test2|Romeo & Juliet|1 |
|3 |test3|Hamlet |2 |
-------------------------------
Теперь вот вторая триггер нам нужно создать, который будет сохранить my_eav
, если изменения произошли в posts
. Обратите внимание, что мы создаем этот триггер на таблице posts
. В примере кода, он выглядел, как вы пытались тянуть измененное значение из posts
с помощью триггера на my_eav
, когда на самом деле вам нужно толчке измененное значение для my_eav
с помощью триггера на posts
:
CREATE TRIGGER update_title AFTER UPDATE ON posts
BEGIN
UPDATE my_eav SET v = (select title from posts where posts.id = v_link);
END;
Теперь давайте проверим его обновляя название в posts
таблице:
update posts set title='Othello' where title='Romeo & Juliet';
Убедитесь, что обновление произошло:
select * from posts;
Таблица теперь показывает:
--------------------
|id |title |
--------------------
| 1 |Othello |
| 2 |Hamlet |
--------------------
И если мы проверим my_eav
,
select * from my_eav;
Триггер на posts
держали его в синхронизации:
-------------------------------
|id|k |v |v_link|
-------------------------------
|1 |test1|Othello |1 |
|2 |test2|Othello |1 |
|3 |test3|Hamlet |2 |
-------------------------------
Надеюсь недеформированной Правильная проблема, и это помогает.
Это то, к чему присоединяются, есть ли причина, по которой вы не хотите использовать соединение? – benedikt
Я знаю, но я не думаю, что объединить работы внутри create table statement –
Нет, но это не главное. Если вы соединяете таблицы при запросе данных, вы можете получить 'my_eav.k' и' posts.title' вместе. – benedikt