В основном мой вопрос заключается в том, как мне скопировать определенную таблицу без (как и всего ее содержимого) столбца идентификаторов?
Чтобы уточнить, скажем, у меня есть схема с именем completed_tasks
, и я хотел бы вставить все ее содержимое в completed_tasks_archive
:
$stmt = $GLOBALS['conn']->prepare("INSERT INTO completed_tasks_archive SELECT * FROM completed_tasks; ");
$stmt->execute();
Код должен работать нормально, но из-за столбца идентификаторов, который я бы назвал ID
, я не могу выполнить эту операцию.
Я получаю ошибку, подобную этой:
PHP Fatal error: Uncaught PDOException: SQLSTATE[23000]: [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]An explicit value for the identity column in table 'completed_tasks_archive' can only be specified when a column list is used and IDENTITY_INSERT is ON.
По сути, мне интересно, есть ли более быстрый способ выполнить эту транзакцию данных без указания всех мельчайших деталей в запросе.
Я использую MS SQLSRV для хранения данных.
And I kind of begin to hate MS SQLSRV after working with MySQLi for a couple of weeks.
Я извиняюсь, если мой вопрос немного запутан, но я все еще учусь, как использовать все это и, что более важно, учусь, как использовать это элегантно.
Поскольку вы используете столбец с автоинкрементным идентификатором, вам необходимо разрешить вставку для этого столбца.
SET IDENTITY_INSERT completed_tasks_archive ON;
После выполнения вставки вы должны деактивировать ее.
SET IDENTITY_INSERT completed_tasks_archive OFF;
Вы также должны указать имена столбцов. Знака "*" недостаточно.
Взгляните на ИДЕНТИФИКАЦИОННАЯ ВСТАВКА
Целевая таблица также имеет идентификатор. Если вы делаете это по историческим причинам, то нет смысла иметь это свойство удостоверения. Вы можете просто изменить этот столбец (в SSMS это нормально), чтобы удалить свойство идентификации из целевой таблицы.