2009-04-21 32 views
16

Tôi cần phải viết kịch bản thiết lập cho MySQL (thường chạy bằng 'source [file]' từ console mysql) phụ thuộc một phần vào dữ liệu hiện có, và có sự khác biệt về môi trường, có nghĩa là đôi khi kịch bản thất bại. Một trường hợp phổ biến là một câu lệnh 'SET' với một lựa chọn (để định vị một id) không tìm thấy bất cứ điều gì; giao diện điều khiển đặt giá trị NULL. Trong trường hợp này tôi muốn kịch bản thất bại; Tôi đã nghe điều này sẽ được thực hiện bằng cách nâng cao lỗi (với các DB khác). Tuy nhiên có vẻ như MySQL không có cách nào để làm điều này.Cách để hủy bỏ việc thực thi các tập lệnh MySQL (có thể gây lỗi)?

Có cách nào tốt để buộc lỗi trong các điều kiện như vậy không? Vì mọi thứ bây giờ cập nhật sẽ thất bại khi chèn cố gắng sử dụng null, nhưng ngay cả điều đó không chấm dứt chính kịch bản. Lý tưởng nhất là nó sẽ thất bại và chấm dứt ngay sau khi một vấn đề được gặp phải.

+1

Dường như trùng lặp: http://stackoverflow.com/questions/465727/raise-error-within-mysql-function/466826 –

+0

Hmmh. Nó có liên quan nhưng tôi không chắc chắn đó là một dup, kể từ khi tôi đang chạy sql từ mysql console, và không có thủ tục được lưu trữ. Nhưng có lẽ tôi misundertand diffs ở đây (là giao diện điều khiển chỉ về cơ bản chạy những thứ tương tự như procs lưu trữ sẽ thực hiện?). Cảm ơn bạn đã liên kết ở bất kỳ mức nào. – StaxMan

+1

Có thể có các tùy chọn mới đến MySQL 6 xem http://bugs.mysql.com/bug.php?id=35634 – KCD

Trả lời

7

Tôi nghĩ những gì bạn đang gặp phải là hạn chế của bảng điều khiển MySQL. Đưa ra một danh sách các câu lệnh, giao diện điều khiển MySQL thực hiện mỗi câu lệnh bất kể bất kỳ lỗi nào được tạo ra. Ngay cả khi bạn đã triển khai một số gợi ý gây lỗi mà các nhận xét trước đó đã đề cập, bảng điều khiển MySQL sẽ không ngừng thực hiện khi gặp lỗi như vậy.

Tôi giả định rằng bạn không có tài nguyên để áp dụng ngôn ngữ kịch bản cho sự cố có thể thực thi SQL của bạn cho bạn và xử lý các lỗi. Tôi nghĩ trong trường hợp này, bạn chỉ cần một công cụ mạnh mẽ hơn so với giao diện điều khiển MySQL.

MySQL Administrator thực hiện những gì bạn cần, nếu tôi hiểu vấn đề của bạn một cách chính xác. Nếu bạn thiết lập kết nối MySQL và kết nối với cơ sở dữ liệu, bạn có hai công cụ có sẵn từ trình đơn Công cụ. Bàn điều khiển MySQL bình thường có ở đó, nhưng bạn cũng có Trình duyệt truy vấn MySQL.

Nếu bạn mở Trình duyệt truy vấn, bạn sẽ có giao diện GUI phong nha về cơ sở dữ liệu MySQL của mình. File -> Open Script để mở tập lệnh SQL của bạn, sau đó sử dụng nút Thực thi.

Bạn nhận được thanh tiến trình tốt và quan trọng hơn là âm thanh của nó, nếu truy vấn không thành công, lệnh thực hiện tạm dừng và làm nổi bật truy vấn không thành công. Bạn có thể chọn bỏ qua và tiếp tục hoặc thậm chí sửa đổi dữ liệu của mình theo cách thủ công và bắt đầu từ nơi nào đó khác xa hơn tập lệnh.

Tôi đã từ bỏ giao diện điều khiển MySQL gần như ngay lập tức khi tôi phát hiện ra và đã cố gắng Quản trị viên.

+0

Tôi nên làm rõ rằng đây là chức năng phiên bản Windows mà tôi mô tả. Tôi chưa từng trải nghiệm các phiên bản Linux/Mac, nhưng tôi cho rằng họ cũng sẽ tạm dừng trong công cụ Trình duyệt truy vấn của họ. – zombat

+0

Cảm ơn! Tôi muốn giao diện điều khiển là chút nhiều tính năng đầy đủ, nhưng tôi chắc chắn cần phải có một cái nhìn tại MySQL Administrator sau đó. – StaxMan

+0

@zombat, Tại sao bạn sử dụng Workbench thay vì những cái tốt hơn như phpMyAdmin, Navicat, HeidiSQL, SQLyog, SQLWave, Toad, dbForge? – Pacerier

1

Có vẻ như KILL QUERY nên làm những gì bạn cần.

+0

Cảm ơn các liên kết, đó là thú vị và hữu ích, nhưng không hoàn toàn những gì tôi cần. Đối với tôi vấn đề không phải là một truy vấn cần phải được chấm dứt nhưng kịch bản đó (chuỗi các câu lệnh) cần phải thất bại nếu một trong các câu lệnh không thành công. – StaxMan

13

Tôi gặp sự cố tương tự và GUI không phải là tùy chọn cho tôi. Đây là cách tôi giải quyết nó:

DELIMITER $$ 

    DROP FUNCTION IF EXISTS sfKillConnection $$ 

    CREATE FUNCTION sfKillConnection() RETURNS INT 
    BEGIN 

     SELECT connection_id() into @connectionId; 
     KILL @connectionId; 
     RETURN @connectionId; 
    END $$ 


    DELIMITER ; 

Đó là một chức năng thay vì một thủ tục để nó có thể được gọi trong một kịch bản như thế này:

select if(@error, sfKillConnection(), 0); 

Bạn có lẽ sẽ cần phải bắt đầu cho khách hàng mysql với --disable-reconnect tùy chọn.

+0

Xin chào, điều này thật gọn gàng! thanh danh! –

+0

thực sự nó sẽ trực tiếp hơn với '@@ error_count'. – Adam

2

Đây là cách để thực thi các lệnh nâng cấp của bạn chỉ khi có một phiên bản nhất định.

Thật xấu xí nhưng đó là tất cả những gì tôi có thể đề xuất cho mysql 5.

DELIMITER $$ 
DROP FUNCTION IF EXISTS `Upgrade_Build`$$  
CREATE FUNCTION `Upgrade_Build`(bversion INT) RETURNS varchar(30) 
BEGIN 
    IF bversion = (SELECT MIN(`db_version`) FROM `system`) THEN 
    UPDATE `pages` 
     SET `component_parameters` = 
     REPLACE(`component_parameters`,'folderviewer_','folder_viewer.'); 
    UPDATE `system` 
     SET `db_version` = bversion+1; 
    return CONCAT('Success: ',bversion,' > ',bversion+1); 
    ELSE 
    return CONCAT('Failed - Version is ',(SELECT MIN(`db_version`) FROM `system`)); 
    END IF; 
END$$ 
DELIMITER ; 

Để sử dụng nó làm điều này:

SELECT Upgrade_Build(1327); 

Bạn sẽ thấy một cái gì đó như thế này nếu phiên bản hiện tại WS 1327:

thành công: 1327> 1328

Run lần thứ hai và bạn sẽ thấy:

Không thành công - Phiên bản là 1328

Hy vọng điều này sẽ được sử dụng cho ai đó.

0

Dưới đây là một cách tiếp cận trán thấp:

tôi cần phải chắc chắn rằng @search_admin_realname tương ứng với một bản ghi trong bảng profiles; nếu không, tôi muốn hủy bỏ kịch bản của mình.

Vì vậy, tôi đã làm điều này:

select @search_admin_id:= userid 
from profiles 
where [email protected]_admin_realname 
; 
# test that @search_admin_id is not null; 
# if it is, then the insert will fail and script will abort. 
create temporary table t_search_admin_id (search_admin_id mediumint(9) not null); 
insert into t_search_admin_id (search_admin_id) values (@search_admin_id); 

Hạn chế duy nhất là tôi có thể không thực sự tùy chỉnh các thông báo lỗi :(

+0

Thú vị, cảm ơn! – StaxMan

5

MySQL Workbench nay thay thế MySQL Administrator

Sử dụng 'Chuyển đổi. việc thực thi tập lệnh SQL có nên tiếp tục sau khi các câu lệnh không thành công '

Toggle whether execution of SQL script should continue after failed statements

Các vấn đề liên quan