Могу ли я иметь одну таблицу как псевдоним или символическую ссылку для другой?


10

У меня есть две таблицы с одинаковой структурой, A и B. Определенное приложение написано так, что оно всегда записывает одни и те же данные в обе таблицы.

После обсуждения с коллегой возможности экономии места на диске мне стало интересно, может ли mysql или postgresql создавать на столе в качестве «псевдонима» или «символической ссылки» другого.

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


2
Вы рассматривали вид стола?

В SQL Server вы можете просто использовать представление.
JNK

1
Какая СУБД? Вы пометили MySQL и Postgres. Представления будут работать в большинстве РСУБД. Oracle имеет синонимы, которые совпадают с символьными ссылками Unix
Philᵀᴹ

MySQL и Postgres, да. Я упоминаю их конкретно в тексте, а также. Я подумал, что Views - это не совсем то, что я искал, но, возможно, все будет хорошо. Большое спасибо. Опубликовать некоторые ответы :)
user50849

1
а зачем тебе две таблицы?
чудо173

Ответы:


5

Насколько я знаю, новый Postgresql позволяет вам иметь INSTEAD OFтриггеры на представлениях. Таким образом, наличие одной таблицы, одного представления как SELECT * FROM table1и INSTEAD OFтриггера для insert, update, deleteдолжно работать на вас. Этот подход не будет работать в Mysql, хотя


2

В MySQL можно (используя только механизм хранения MyISAM) создать таблицу с нуля, используя символические ссылки. Это возможно в Linux и Windows (используя жесткие ссылки):

Вот мои прошлые посты на эту тему

Однако то, что вы предлагаете, должно быть сделано за пределами MySQL в Linux.

Для этого примера

  • / var / lib / mysql - это datadir
  • Создать table1 как MyISAM таблицу в базе данных mydb
  • Создать table2 как чистые символические ссылки на table1

ШАГ 01) Создать таблицу1

CREATE TABLE mydb.table1
(
    id int not null auto_increment,
    mydata varchar(255) not null,
    primary key (id)
) ENGINE=MyISAM;

ШАГ 02) Создайте три символические ссылки для имитации TableB

cd /var/lib/mysql/mydb
ln -s table1.frm table2.frm
ln -s table1.MYD table2.MYD
ln -s table1.MYI table2.MYI

ШАГ 03) Попробуйте вставить в таблицу 1 и прочитать из таблицы 2. Тогда попробуйте обратное.

INSERT INTO table1 (mydata) VALUES ('rolando'),('edwards');
SELECT * FROM table2;
INSERT INTO table2 (mydata) VALUES ('abraham'),('lincoln');
SELECT * FROM table1;

Если все ведет себя нормально, то вот как вы можете это сделать.

ПРЕДОСТЕРЕЖЕНИЕ

  1. Есть только одна таблица, таблица1
  2. Если вы делаете какой-либо DDL
    • Выполните DDL на table1
    • Вы должны воссоздать символьные ссылки table2 после DDL против table1
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.