2009-12-11 43 views
18

Tôi đang di chuyển một ứng dụng MS Access (đã liên kết các bảng với Máy chủ MSSQL) thành MySQL.Làm cách nào để tạo bí danh bảng trong MySQL

Như một phương tiện để khắc phục một số vấn đề đặt tên bảng MSAccess, tôi đang tìm kiếm giải pháp để thêm bí danh bảng MySQL sẽ trỏ đến một bảng hiện có trong cơ sở dữ liệu MySQL. Lý tưởng nhất là tôi muốn tạo bí danh 'dbo_customers' trong mysql mà sẽ trỏ đến bảng khách hàng cũng trong mysql.

Để được rõ ràng Tôi không muốn bí danh một tên bảng bên trong một truy vấn như thế này:

SELECT * FROM customers AS dbo_customers 

Nhưng thay vì tôi muốn trở thành vấn đề có thể truy vấn sau đây:

SELECT * FROM dbo_customers 

và yêu cầu trả lại dữ liệu từ bảng khách hàng.

+6

Tại sao không đổi tên bảng? –

+3

Trong một số trường hợp đổi tên bảng sẽ không hoạt động. Ví dụ: nếu bạn đang làm việc với hai hệ thống ORM với các quy ước đặt tên khác nhau, bạn cần một bí danh để cả hai hoạt động tốt. Trong trường hợp đó, bằng cách này, giải pháp được chấp nhận là đủ tốt cho tôi :) – Nimo

Trả lời

31

Off đỉnh đầu của tôi

CREATE VIEW dbo_customers AS 
SELECT * FROM customers 

Có lẽ không phải là giải pháp tốt nhất nhưng nên hoạt động như quan điểm là có thể cập nhật. Chắc chắn sẽ hoạt động cho Chỉ đọc

+0

Tôi nên nói trong bài viết đầu tiên của mình rằng tôi phải có khả năng cập nhật dữ liệu. Tôi không nghĩ rằng một cái nhìn sẽ đáp ứng nhu cầu của tôi - trừ khi quan điểm bằng cách nào đó có thể cập nhật? – rswolff

+4

có, chế độ xem này có thể cập nhật. – longneck

+0

Tôi thực sự không nghĩ đây là giải pháp đơn giản nhất. –

5

Bạn có thể tạo View.

CREATE VIEW dbo_customers AS SELECT * FROM customers; 

Nếu điều đó không hiệu quả với bạn, bạn có thể thử tạo bản sao ẩn của bảng và sử dụng Trình kích hoạt để giữ cho bảng được đồng bộ hóa.

Ví dụ:

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 

Không hẳn một 'bí danh', và xa hoàn hảo. Nhưng nó là một lựa chọn nếu tất cả những thứ khác thất bại.

0

Bạn có thể tạo view có tên dbo_customers được hỗ trợ bởi bảng customers.

-1

có một giải pháp đơn giản cho MySQL thông qua công cụ bảng MERGE:

tưởng tượng, chúng tôi đã bàn tên rus_vacancies và cần tương đương với tiếng Anh của nó

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); 

tại bảng rus_vacancies tương đương với bảng eng_vacancies cho bất kỳ đọc-ghi hoạt động

một giới hạn - bảng gốc phải có ENGINE = MyISAM (có thể dễ dàng thực hiện theo "alter table rus_vacancies ENGINE=MyISAM")

0

ngựa @OMG Ngựa Non cho biết trong một chú thích:

Tại sao không đổi tên bảng?

... và có vẻ như câu trả lời hiển nhiên đối với tôi.

Nếu bạn tạo một bảng được liên kết ODBC cho khách hàng bảng MySQL, nó sẽ được gọi là khách hàng và sau đó tất cả những gì bạn phải làm là đổi tên bảng thành dbo_customers.Hoàn toàn không cần tôi có thể thấy để tạo ra một khung nhìn trong MySQL cho mục đích này.

Điều đó nói rằng, tôi ghét phải có ứng dụng Access đang sử dụng tên bảng SQL Server khi bảng MySQL không được đặt tên giống nhau - điều đó chỉ gây nhầm lẫn và sẽ dẫn đến các vấn đề bảo trì (tức là đơn giản hơn các bảng được nối kết trong giao diện người dùng Access có cùng tên với các bảng MySQL, bất cứ khi nào có thể). Nếu tôi ở vị trí của bạn, tôi sẽ tìm kiếm và thay thế tiện ích và thay thế tất cả tên bảng SQL Server bằng tên bảng MySQL trong toàn bộ giao diện truy cập. Bạn có thể sẽ phải làm điều đó một bảng tại một thời điểm, nhưng theo ý kiến ​​của tôi, thời gian cần để làm điều này bây giờ sẽ được nhiều hơn làm cho trong rõ ràng đi về phía trước với sự phát triển của kết thúc trước truy cập.

+0

trường hợp sử dụng thường xuyên là bạn thanh toán cho một cam kết cũ hơn và cần bạn làm việc với cơ sở dữ liệu cũ hơn. – PHPst

1

tôi luôn luôn đổi tên của tôi "liên quan đến SQL" bảng trong Access từ

{dbo_NAME}-{NAME}.

Liên kết tạo tên bảng là {dbo_NAME} nhưng quyền truy cập đôi khi gặp sự cố với tiền tố dbo_.

-2

Bạn phải tạo chế độ xem cho bảng và sau đó chọn từ đó.

+0

đó là lý do tại sao chúng tôi có tính năng nhận xét. Hãy làm cho câu trả lời của bạn được giải thích thêm. –

1

Bí danh sẽ đẹp, nhưng MySQL thực hiện NOT có tính năng như vậy.

Một tùy chọn có thể đáp ứng nhu cầu của bạn, ngoài việc tạo chế độ xem, là sử dụng địa chỉ FEDERATED storage engine cục bộ.

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'; 

Hiện tại có một số limitations with the FEDERATED storage engine. Dưới đây là một vài đặc biệt là những người quan trọng:

  • bảng FEDERATED không hỗ trợ giao dịch bảng
  • FEDERATED không làm việc với bộ nhớ cache truy vấn
Các vấn đề liên quan