programing

MySQL에서 테이블 별칭을 만드는 방법

magicmemo 2023. 8. 29. 20:20
반응형

MySQL에서 테이블 별칭을 만드는 방법

MSSQL 서버에 테이블을 연결한 MS Access 응용프로그램을 MySQL로 마이그레이션하는 중입니다.

MSAccess 테이블 명명 문제를 해결하기 위한 방법으로 MySQL 데이터베이스의 기존 테이블을 가리키는 MySQL 테이블 별칭을 추가할 솔루션을 찾고 있습니다.이상적으로는 mysql에도 고객 테이블을 가리키는 별칭 'dbo_customers'를 만들고 싶습니다.

다음과 같은 쿼리 내의 테이블 이름에 별칭을 지정하고 싶지 않습니다.

SELECT * FROM customers AS dbo_customers

하지만 그보다는 다음과 같은 질문을 할 수 있기를 바랍니다.

SELECT * FROM dbo_customers

고객 테이블의 데이터를 반환하도록 합니다.

내 머리에서 당장

CREATE VIEW dbo_customers AS
SELECT * FROM customers

최상의 솔루션은 아니지만 보기가 업데이트 가능한 상태에서 작동해야 합니다.읽기 전용으로 작동합니다.

보기를 작성할 수 있습니다.

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

정확히 '에일리어스'는 아니며, 완벽과는 거리가 멉니다.하지만 다른 모든 것이 실패한다면 그것은 선택사항입니다.

MERGE 테이블 엔진을 통한 MySQL에 대한 더 간단한 솔루션이 있습니다.

우리에게 이름이 붙은 테이블이 있다고 상상해 보세요.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=My여야 합니다.ISAM(이를 통해 쉽게 수행할 수 있음)alter table rus_vacancies ENGINE=MyISAM")

이름이 지정된 보기를 만들 수 있습니다.dbo_customers그것은 지원을 받습니다.customers테이블.

@OMG 조랑말은 논평에서 다음과 같이 말했습니다.

테이블 이름을 변경하는 것이 어떻습니까?

...그리고 그것은 제게 명백한 답인 것 같습니다.

MySQL 테이블 고객에 대한 ODBC 연결 테이블을 생성하면 고객이라고 하고 테이블 이름을 dbo_customers로 바꾸기만 하면 됩니다.이러한 목적을 위해 MySQL에서 보기를 만들 필요가 전혀 없습니다.

즉, MySQL 테이블의 이름이 동일하지 않을 때 SQL Server 테이블 이름을 사용하는 Access 앱을 사용하고 싶지 않습니다. 이는 혼란스럽고 유지 관리 문제로 이어질 수 있습니다(즉, 액세스 프런트 엔드의 링크된 테이블이 MySQL 테이블과 동일한 이름을 갖는 것이 가능한 한 더 간단합니다).내가 당신 입장이라면, 유틸리티를 검색하고 교체하고 전체 액세스 프런트 엔드에서 모든 SQL Server 테이블 이름을 MySQL 테이블 이름으로 교체할 것입니다.한 번에 한 테이블씩 수행해야 할 수도 있지만, 액세스 프런트 엔드를 개발하는 데 필요한 시간은 앞으로 불투명한 부분을 보완하는 것 이상이 될 것이라고 생각합니다.

액세스 위치에서 "SQL에 연결된" 테이블의 이름을 항상 변경합니다.

{dbo_NAME}{NAME}.

을 링는다같테이만듭니다름을이로 만듭니다.{dbo_NAME}하지만 가끔 dbo_ 접두사에 문제가 있습니다.

별칭도 좋지만 MySQL에는 이러한 기능이 없습니다.

보기를 생성하는 것 외에 필요에 따라 사용할 수 있는 한 가지 옵션은 연합 스토리지 엔진을 로컬에서 사용하는 것입니다.

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://fed_user@localhost:9306/federated/customers';

현재 연합 스토리지 엔진에는 몇 가지 제한 사항이 있습니다.다음은 특히 중요한 몇 가지 사항입니다.

  • Federated 테이블이 트랜잭션을 지원하지 않음
  • 연합 테이블이 쿼리 캐시에서 작동하지 않음

는 제가(그리고 했던) 나쁜 은 .frm, .frm,frm의 를 사용하는 이었습니다. 그것은 .frm에서 하드 링크를 사용하는 것이었습니다.MYD 그리고. 표에 해당하는 은 MYI에 ./var/lib/mysql/{name_of_my_database}/.

하지만 효과가 없습니다.InnoDB 테이블의 경우 테이블도 ibdata1에서 참조되기 때문에 (.idb 파일을 하드 링크하더라도) 할 수 없습니다.

MyISAM 테이블의 경우, 메모리에서 테이블이 여전히 구별되어 캐시를 공유하지 않기 때문에 작동하지 않는 것을 제외하고는 작동합니다.그래서 만약 당신이 행을 쓴다면.original_table▁appear다▁won에 바로 나타나지 않습니다.aliased_table테이블을 먼저 플러시해야 합니다. 이렇게 하면 목적에 맞지 않고 데이터 손실까지 발생할 수 있습니다. 플러시하기 전에 원본과 별칭 모두에 행을 삽입하면 한 행만 유지됩니다.

저는 제 실험이 경고성 이야기로 언급할 가치가 있다고 생각했습니다.

언급URL : https://stackoverflow.com/questions/1890155/how-do-i-create-a-table-alias-in-mysql

반응형