2010-09-01 37 views
14

Tôi muốn biết làm thế nào để sử dụng DROP TABLE IF EXISTS trong một thủ tục MySQLstored. Tôi đang viết một thủ tục lưu trữ mySQL khá dài sẽ thực hiện một loạt công việc và sau đó tải lên một bảng tạm thời với kết quả. Tuy nhiên, tôi đang gặp khó khăn khi thực hiện công việc này.Làm thế nào để sử dụng DROP BẢNG NẾU EXISTS trong một thủ tục lưu trữ MySQL

Tôi đã nhìn thấy một vài cách để thực hiện điều bảng tạm thời. Về cơ bản, bạn tạo bảng tạm thời, làm việc trên nó, và sau đó thả nó vào cuối ... hoặc bạn thả nó nếu nó tồn tại, tạo ra nó, và sau đó làm công việc của bạn trên đó.

Tôi thích phương pháp thứ hai để bạn luôn bắt đầu làm sạch và đây là một kiểm tra tích hợp cho sự tồn tại của bảng. Tuy nhiên, tôi dường như không thể có được nó để làm việc:

Dưới đây là những ví dụ của tôi:

này Tác phẩm:

DELIMITER// 
    DROP PROCEDURE IF EXISTS pTest// 
    CREATE PROCEDURE pTest() 
    BEGIN 
     CREATE TEMPORARY TABLE tblTest (
      OrderDate varchar(200) 
     ); 
     DROP TEMPORARY TABLE tblTest; 
    END// 
DELIMITER ; 
CALL pTest(); 

này Tác phẩm:

DELIMITER// 
    DROP PROCEDURE IF EXISTS pTest// 
    CREATE PROCEDURE pTest() 
    BEGIN 
     DROP TEMPORARY TABLE tblTest; 
     CREATE TEMPORARY TABLE tblTest (
      OrderDate varchar(200) 
     ); 
    END// 
DELIMITER ; 
CALL pTest(); 

Điều này không:

DELIMITER// 
    DROP PROCEDURE IF EXISTS pTest// 
    CREATE PROCEDURE pTest() 
    BEGIN 
     DROP TEMPORARY TABLE IF EXISTS tblTest; 
     CREATE TEMPORARY TABLE tblTest (
      OrderDate varchar(200) 
     ); 
    END// 
DELIMITER ; 
CALL pTest(); 

2 công việc đầu tiên, nhưng nếu bảng đó tồn tại (như nếu thủ tục không hoàn thành hoặc gì đó), nó sẽ kết thúc với lỗi "Bảng tblTest không tồn tại". Ví dụ không làm việc là những gì tôi đang tìm kiếm - thả bảng nếu nó ở đó và sau đó tạo lại nó để tôi có thể bắt đầu làm sạch.

Có vẻ như đó là "NẾU DANH SÁCH" làm cho điều này thất bại. Tôi đã sao chép mã từ tất cả các loại trang web làm những việc rất giống nhau và trong mọi trường hợp tôi có thể nhận được "DROP TABLE IF EXISTS ..." để hoạt động. Không bao giờ.

Dev Server: phiên bản mySQL Server: 5.1.47-cộng đồng Prod Server: mySQL Server phiên bản: 5.0.45-log

Chúng ta không thể thay đổi db phiên bản (DBA sẽ không cho phép nó), vì vậy Tôi bị mắc kẹt với những gì tôi có. Đây có phải là lỗi trong mySQL hoặc trong Quy trình không?

Cảm ơn.

+0

tôi có lẽ đã gửi sai số thực tế mà tôi nhận được ... [Err] 1064 - Bạn có một lỗi trong cú pháp SQL của bạn; kiểm tra hướng dẫn tương ứng với phiên bản máy chủ MySQL của bạn để biết cú pháp đúng để sử dụng gần '// DELIMITER; CALL pTest() 'tại dòng 7 Đơn giản chỉ cần loại bỏ "IF EXISTS" loại bỏ lỗi và toàn bộ proc hoạt động (trừ khi, tất nhiên, bảng không tồn tại;) –

Trả lời

1

Tôi không biết tại sao điều này không hiệu quả với bạn, nhưng bạn sẽ có thể giải quyết vấn đề bằng cách sử dụng trình xử lý tiếp theo. Nếu bạn đặt câu lệnh DROP TABLE vào khối BEGIN...END riêng của mình, bạn có thể sử dụng trình xử lý tiếp tục để bỏ qua lỗi nếu bảng không tồn tại.

Hãy thử điều này:

DELIMITER // 
    DROP PROCEDURE IF EXISTS pTest // 
    CREATE PROCEDURE pTest() 
    BEGIN 
     BEGIN 
     DECLARE CONTINUE HANDLER FOR SQLSTATE '42S02' BEGIN END; 
     DROP TEMPORARY TABLE tblTest; 
     END; 
     CREATE TEMPORARY TABLE tblTest (
      OrderDate varchar(200) 
     ); 
    END // 
DELIMITER ; 
CALL pTest(); 
+0

Chạy câu lệnh chính xác đó cho tôi cùng lỗi : [Err] 1064 - Bạn có lỗi trong cú pháp SQL của mình; kiểm tra hướng dẫn tương ứng với phiên bản máy chủ MySQL của bạn để biết cú pháp đúng để sử dụng gần '// DELIMITER; GỌI pTest() 'tại dòng 10 –

2

Tôi cũng có cùng một vấn đề. Có vẻ như MySQL không muốn kiểm tra xem bảng có tồn tại trên một số phiên bản hay không. Tôi đã làm việc xung quanh vấn đề bằng cách truy vấn cơ sở dữ liệu đầu tiên, và nếu tôi tìm thấy một bảng tôi đã bỏ nó. Sử dụng PHP:

$q = @mysql_query("SELECT * FROM `$name`"); 
if ($q){ 
    $q = mysql_query("DROP TABLE `$name`"); 
    if(!$q) die('e: Could not drop the table '.mysql_error()); 
} 

Bạn chặn lỗi trong truy vấn đầu tiên có ký hiệu @, vì vậy bạn không có lỗi gây nhiễu, sau đó thả bảng khi truy vấn trả về sai.

16

Đó là một câu hỏi cũ nhưng nó xuất hiện khi tôi đang tìm DROP TABLE IF EXISTS.

Mã không hoạt động của bạn không hoạt động trên máy chủ MySQL 5.1.70 của tôi.

Tất cả những gì tôi phải làm là thêm khoảng cách giữa DELIMITER và // trên dòng đầu tiên và mọi thứ hoạt động tốt.

đang làm việc:

DELIMITER // 
    DROP PROCEDURE IF EXISTS pTest// 
    CREATE PROCEDURE pTest() 
    BEGIN 
     DROP TEMPORARY TABLE IF EXISTS tblTest; 
     CREATE TEMPORARY TABLE tblTest (
      OrderDate varchar(200) 
     ); 
    END// 
DELIMITER ; 
Các vấn đề liên quan