Подтвердить что ты не робот

Как создать псевдоним таблицы в MySQL

Я переношу приложение MS Access (которое связывает таблицы с сервером MSSQL) в MySQL.

Как средство преодоления некоторых проблем с именами таблиц MSAccess, я ищу решение добавить псевдоним таблицы MySQL, который укажет на существующую таблицу в базе данных MySQL. В идеале я хотел бы создать псевдоним "dbo_customers" в mysql, который будет указывать на таблицу Customers также в mysql.

Чтобы быть ясным, я не хочу, чтобы псевдоним имени таблицы внутри запроса выглядел следующим образом:

SELECT * FROM customers AS dbo_customers

Но, скорее, я хотел бы задать следующий запрос:

SELECT * FROM dbo_customers

и вернуть данные из таблицы клиентов.

4b9b3361

Ответ 1

Сверху моей головы

CREATE VIEW dbo_customers AS
SELECT * FROM customers

Возможно, это не лучшее решение, но должно работать, поскольку представление обновляется. Будет определенно работать только для чтения

Ответ 2

Вы можете создать View.

CREATE VIEW dbo_customers AS SELECT * FROM customers;

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

Например:

CREATE TABLE t1( id serial primary key, field varchar(255) not null );
CREATE TABLE dbo_t1( id serial primary key, field varchar(255) not null );

-- INSERT trigger
CREATE TRIGGER t1_dbo_insert AFTER INSERT ON t1
FOR EACH ROW BEGIN
    INSERT INTO dbo_t1 SET field = NEW.field;
    -- No need to specify the ID, it should stay in-sync
END

-- UPDATE trigger
CREATE TRIGGER t1_dbo_update AFTER UPDATE ON t1
FOR EACH ROW BEGIN
    UPDATE dbo_t1 SET field = NEW.field WHERE id = NEW.id;
END

-- DELETE trigger
CREATE TRIGGER t1_dbo_delete AFTER DELETE ON t1
FOR EACH ROW BEGIN
    DELETE FROM dbo_t1 WHERE id = OLD.id;
END

Не совсем "псевдоним" и далек от совершенства. Но это вариант, если все остальное не работает.

Ответ 3

Я всегда переименовываю таблицы, связанные с SQL, в Access из

{dbo_NAME} до {NAME}.

Ссылка создает имя таблицы как {dbo_NAME}, но при доступе иногда возникают проблемы с префиксом dbo_.

Ответ 4

Псевдонимы были бы хороши, но MySQL имеет НЕ такую ​​функцию.

Один из вариантов, который может служить вашим потребностям, помимо создания представления, заключается в том, чтобы локально использовать FEDERATED storage engine.

CREATE TABLE dbo_customers (
    id     INT(20) NOT NULL AUTO_INCREMENT,
    name   VARCHAR(32) NOT NULL DEFAULT '',
    PRIMARY KEY  (id),
)
ENGINE=FEDERATED
DEFAULT CHARSET=latin1
CONNECTION='mysql://[email protected]:9306/federated/customers';

В настоящее время существуют ограничения с FEDERATED механизмом хранения. Вот пара особенно важных:

  • ФЕДЕРАЛЬНЫЕ таблицы не поддерживают транзакции.
  • ФЕДЕРАЛЬНЫЕ таблицы не работают с кешем запросов

Ответ 5

Вы можете создать view с именем dbo_customers, который поддерживается таблицей customers.

Ответ 6

@OMG Ponies ponies сказал в комментарии:

Почему бы не переименовать таблицу?

... и это кажется очевидным ответом на меня.

Если вы создаете связанную с ODBC таблицу для клиентов таблицы MySQL, она будет называться клиентами, а затем все, что вам нужно сделать, - переименовать таблицу в dbo_customers. Нет абсолютно никакой необходимости в том, чтобы я мог создать представление в MySQL для этой цели.

Тем не менее, мне бы очень хотелось иметь приложение Access, в котором использовались имена таблиц SQL Server, когда таблицы MySQL не были названы одинаковыми - это просто запутывает и приведет к проблемам обслуживания (т.е. проще для связанные таблицы в конце доступа Access, чтобы иметь те же имена, что и таблицы MySQL, где это возможно). Если бы я был на вашем месте, я бы получил утилиту поиска и замены и заменил все имена таблиц SQL Server именами таблиц MySQL на всем конечном интерфейсе Access. Скорее всего, вам придется делать это по одной таблице за раз, но, на мой взгляд, время, затрачиваемое на это, будет более чем восполнено в ясности в будущем с развитием интерфейса доступа.

Ответ 7

существует более простое решение для MySQL через движок таблицы MERGE:

представьте, что у нас есть таблица с именем rus_vacancies и ей нужен ее английский эквивалент

create table eng_vacancies select * from rus_vacancies;
delete from eng_vacancies;
alter table eng_vacancies ENGINE=MERGE;
alter table eng_vacancies UNION=(rus_vacancies);

теперь таблица rus_vacancies равна таблице eng_vacancies для любых операций чтения и записи

одно ограничение - оригинальная таблица должна иметь ENGINE = MyISAM (ее можно легко сделать с помощью < <24 > )

Ответ 8

Вам нужно создать представление для таблицы, а затем выбрать из него.