Чи можу я, щоб одна таблиця була "псевдонімом" або "символьним посиланням", до іншої?


10

У мене дві таблиці з однаковою структурою, A і B. Певна програма написана так, що вона завжди записує однакові дані в обидві таблиці.

Після обговорення з колегою про потенціал економії місця на диску, мені цікаво, чи має mysql або postgresql можливість створювати на столі інший "псевдонім" або "symlink".

Я хочу, щоб поведінка була дуже схожа на поведінку м'якого файлу symlink; де читання з боку самої симпосилання або з цільової мети дасть той самий вихід, а записування на будь-яке оновить ціль.


2
Ви розглядали вид таблиці?

У SQL Server ви могли просто використовувати представлення даних.
JNK

1
Які RDBMS? Ви позначили MySQL та Postgres. Перегляди працюватимуть у більшості RDBMS. У Oracle є синоніми, які є такими ж, як символічні посилання Unix
Philᵀᴹ

MySQL і Postgres, так. Про них я конкретно згадую і в тексті. Я думав, що Перегляд якимось чином не зовсім те, що я шукав, але, можливо, це буде просто чудово. Дуже дякую. Опублікуйте кілька відповідей :)
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) Спробуйте вставити в table1 та прочитати з table2. Потім спробуйте зворотно.

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

Якщо все поводиться нормально, то це можна зробити.

КАВАТИ

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