Hướng dẫn mysql drop temporary table if exists - mysql thả bảng tạm thời nếu tồn tại

Tôi muốn biết cách sử dụng DROP TABLE IF EXISTS trong quy trình mysqlstored. Tôi đang viết một quy trình lưu trữ MySQL khá dài sẽ thực hiện một loạt các 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 trong việc thực hiện công việc này.

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

Tôi thích phương pháp thứ hai để bạn luôn bắt đầu sạch sẽ và đó là 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ể làm cho nó hoạt động:

Đây là những ví dụ của tôi:

Những công việc này:

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

Những công việc này:

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 quy trình không hoàn thành hoặc một cái gì đó), thì rõ ràng 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 sạch sẽ.

Cảm giác như đó là "nếu tồn tại" khiến đ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 không thể nhận được "bảng thả nếu tồn tại ..." để hoạt động. Bao giờ.

Máy chủ Dev: Máy chủ MySQL Phiên bản: 5.1.47-Community Prod Server: MySQL Server Phiên bản: 5.0.45-Log

Chúng tôi không thể thay đổi các phiên bản DB (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 là một lỗi trong MySQL hay trong thủ tục?

Thanks.

13.1.32 & NBSP; Tuyên bố bảng thả

DROP [TEMPORARY] TABLE [IF EXISTS]
    tbl_name [, tbl_name] ...
    [RESTRICT | CASCADE]

DROP TABLE loại bỏ một hoặc nhiều bảng. Bạn phải có đặc quyền DROP cho mỗi bảng.

Hãy cẩn thận với tuyên bố này! Đối với mỗi bảng, nó loại bỏ định nghĩa bảng và tất cả dữ liệu bảng. Nếu bảng được phân vùng, câu lệnh sẽ xóa định nghĩa bảng, tất cả các phân vùng của nó, tất cả dữ liệu được lưu trữ trong các phân vùng đó và tất cả các định nghĩa phân vùng liên quan đến bảng bị rơi. with this statement! For each table, it removes the table definition and all table data. If the table is partitioned, the statement removes the table definition, all its partitions, all data stored in those partitions, and all partition definitions associated with the dropped table.

Thả một bảng cũng giảm bất kỳ yếu tố kích hoạt nào cho bảng.

DROP TABLE gây ra một cam kết ngầm, ngoại trừ khi được sử dụng với từ khóa TEMPORARY. Xem Phần & NBSP; 13.3.3, Các câu lệnh gây ra một cam kết ngầm.

Quan trọng

Khi một bảng bị bỏ, các đặc quyền được cấp cụ thể cho bảng không tự động bị hủy. Họ phải được thả thủ công. Xem Phần & NBSP; 13.7.1.6, Tuyên bố Grant Grant.not automatically dropped. They must be dropped manually. See Section 13.7.1.6, “GRANT Statement”.

Nếu bất kỳ bảng nào có tên trong danh sách đối số không tồn tại, hành vi DROP TABLE phụ thuộc vào liệu mệnh đề

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();
0 có được đưa ra hay không:

  • Không có

    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();
    
    0, câu lệnh không thành công với một lỗi cho biết các bảng không có gì mà nó không thể bỏ và không có thay đổi nào được thực hiện.

  • Với

    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();
    
    0, không có lỗi xảy ra đối với các bảng không tồn tại. Tuyên bố giảm tất cả các bảng có tên tồn tại và tạo chẩn đoán
    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();
    
    3 cho mỗi bảng không tồn tại. Những ghi chú này có thể được hiển thị với
    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();
    
    4. Xem Phần & NBSP; 13.7.7.42, Tuyên bố cảnh báo Show Show.

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();
0 cũng có thể hữu ích cho việc bỏ các bảng trong các trường hợp bất thường, theo đó có một mục trong từ điển dữ liệu nhưng không có bảng nào được quản lý bởi công cụ lưu trữ. .

Từ khóa TEMPORARY có các hiệu ứng sau:

  • Tuyên bố chỉ giảm bảng TEMPORARY.

  • Tuyên bố không gây ra một cam kết ngầm.

  • Không có quyền truy cập được kiểm tra. Một bảng TEMPORARY chỉ hiển thị với phiên tạo ra nó, vì vậy không cần kiểm tra.

Bao gồm từ khóa TEMPORARY là một cách tốt để ngăn chặn vô tình giảm không-____ 8 bảng.

Các từ khóa

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();
1 và
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 không làm gì cả. Họ được phép làm cho việc chuyển giao dễ dàng hơn từ các hệ thống cơ sở dữ liệu khác.

DROP TABLE không được hỗ trợ với tất cả các cài đặt

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();
4. Xem Phần & NBSP; 15.21.3, Buộc phục hồi Innodb.


Điều gì xảy ra nếu bảng chưa tồn tại và bạn cố gắng thả nó?

Nếu chúng ta cố gắng thả một bảng không tồn tại, chúng ta sẽ nhận được thông báo lỗi sau. Chúng tôi không muốn có bất kỳ lỗi nào trong việc thực thi các truy vấn, đặc biệt là trong quá trình thực thi một loạt mã. Trước SQL Server 2016, các nhà phát triển sử dụng câu lệnh IF tồn tại và kiểm tra sự tồn tại của đối tượng trước khi bỏ nó.error message. We do not want any error in executing queries, especially during the execution of a bunch of code. Before SQL Server 2016, developers use the IF EXISTS statement and check for the object existence before dropping it.

Các bảng tạm thời có nhanh hơn MySQL không?

Vì các bảng tạm thời được lưu trữ trong bộ nhớ, chúng nhanh hơn đáng kể so với các bảng dựa trên đĩa.Do đó, chúng có thể được sử dụng hiệu quả làm khu vực lưu trữ trung gian, để tăng tốc độ thực thi truy vấn bằng cách giúp chia các truy vấn phức tạp thành các thành phần đơn giản hơn hoặc thay thế cho phụ và tham gia hỗ trợ.they are significantly faster than disk-based tables. Consequently, they can be effectively used as intermediate storage areas, to speed up query execution by helping to break up complex queries into simpler components, or as a substitute for subquery and join support.

Mục đích của lệnh Drop Bush trong MySQL Làm thế nào khác với lệnh xóa?

Xóa là lệnh ngôn ngữ thao tác dữ liệu, lệnh DML và được sử dụng để loại bỏ các bộ dữ liệu/bản ghi khỏi một mối quan hệ/bảng.Trong khi thả là ngôn ngữ định nghĩa dữ liệu, lệnh DDL và được sử dụng để loại bỏ các phần tử được đặt tên của lược đồ như quan hệ/bảng, các ràng buộc hoặc toàn bộ lược đồ.DROP is a Data Definition Language, DDL command and is used to remove named elements of schema like relations/table, constraints or entire schema.