Откладывая причину ошибки (адрес @ Лев в его ответ ):
Я не нашел ничего конкретного по транзакциям для CREATE TABLE ... AS SELECT
. Любой оператор CREATE TABLE
является операцией DDL, которая, в свою очередь, обычно является нетранзакционной операцией.
Это всего лишь предположение, но я бы сказал, что создание таблицы прошло успешно. Инструкция, которую вы дали, в основном, два в одном, где первая - это фактическое создание таблицы, которая работает (и поскольку она не транзакционная, на нее не может повлиять вторая), а вторая - вариант массовая вставка из select (с неявными коммитами для пакетов), которая прерывается в какой-то момент.
Вероятно, это не ответ на ваш вопрос, но, поскольку в любом случае операция, по-видимому, является двухфазной, если вам нужен более транзакционный подход, вам будет полезно разделить операцию на два отдельных:
первый:
CREATE TABLE tab1 AS SELECT * FROM tab2 WHERE 1 = 2;
второй:
INSERT INTO tab1 SELECT * FROM tab2;
Таким образом, если вторая часть выйдет из строя, вы не получите частичную вставку. Стол все еще будет на месте.