Déplacer des données SQL d'une table à une autre
Je me demandais s'il était possible de déplacer toutes les lignes de données d'une table à une autre, qui correspondent à une certaine requête?
Par exemple, j'ai besoin de déplacer toutes les lignes de table de Table1 à Table2 où leur nom d'utilisateur = 'X' et mot de passe = 'X', de sorte qu'ils n'apparaîtront plus dans Table1.
J'utilise SQL Server 2008 Management Studio.
12 réponses
Devrait être possible en utilisant deux instructions dans une transaction, un insert et un delete:
INSERT INTO Table2 (<columns>)
SELECT <columns>
FROM Table1
WHERE <condition>;
DELETE FROM Table1
WHERE <condition>;
COMMIT;
C'est la forme la plus simple. Si vous devez vous soucier de l'insertion de nouveaux enregistrements correspondants dans table1 entre les deux instructions, vous pouvez ajouter un and exists <in table2>
.
Ceci est un ancien poste, désolé, mais je ne suis tombé sur elle maintenant et je voulais donner ma solution à celui qui pourrait tomber sur ce un jour.
Comme certains l'ont mentionné, effectuer un INSERT
puis un DELETE
peut entraîner des problèmes d'intégrité, donc peut-être un moyen de le contourner, et de tout Exécuter proprement dans une seule instruction, est de profiter de la table temporaire [deleted]
.
DELETE FROM [source]
OUTPUT [deleted].<column_list>
INTO [destination] (<column_list>)
Toutes ces réponses exécutent la même requête pour L'insertion et la suppression. Comme mentionné précédemment, cela risque de supprimer les enregistrements insérés entre les instructions et pourrait être lent si la requête est complexe (bien que les moteurs intelligents "devraient" faire le deuxième appel rapide).
La manière correcte (en supposant que L'insertion est dans une nouvelle table) est de faire la suppression contre table1 en utilisant le champ clé de table2.
Supprimer:
DELETE FROM tbl_OldTableName WHERE id in (SELECT id FROM tbl_NewTableName)
Excusez ma syntaxe, je saute entre les moteurs, mais vous obtenez l'idée.
Oui. Insérez d'abord + sélectionnez, puis supprimez les originaux.
INSERT INTO Table2 (UserName,Password)
SELECT UserName,Password FROM Table1 WHERE UserName='X' AND Password='X'
Puis supprimer les originaux
DELETE FROM Table1 WHERE UserName='X' AND Password='X'
Vous pouvez conserver UserID
ou une autre clé primaire, alors vous pouvez utiliser IDENTITY INSERT
pour préserver la clé.
Essayez ceci
INSERT INTO TABLE2 (Cols...) SELECT Cols... FROM TABLE1 WHERE Criteria
Puis
DELETE FROM TABLE1 WHERE Criteria
Vous devriez pouvoir le faire avec une sous-requête dans L'instruction INSERT.
INSERT INTO table1(column1, column2) SELECT column1, column2 FROM table2 WHERE ...;
Suivi de la suppression de la table1.
N'oubliez pas de l'exécuter comme une seule transaction afin que si quelque chose ne va pas, vous puissiez annuler toute l'opération.
Vous pouvez essayer ceci:
SELECT * INTO tbl_NewTableName
FROM tbl_OldTableName
WHERE Condition1=@Condition1Value
Ensuite, exécutez une simple suppression:
DELETE FROM tbl_OldTableName
WHERE Condition1=@Condition1Value
Utilisez cette seule instruction sql qui est sûre pas besoin de commit / rollback avec plusieurs instructions.
INSERT Table2 (
username,password
) SELECT username,password
FROM (
DELETE Table1
OUTPUT
DELETED.username,
DELETED.password
WHERE username = 'X' and password = 'X'
) AS RowsToMove ;
Fonctionne sur SQL server apporter les modifications appropriées pour MySql
Une représentation plus propre de ce que d'autres réponses ont laissé entendre:
DELETE sourceTable
OUTPUT DELETED.*
INTO destTable (Comma, separated, list, of, columns)
WHERE <conditions (if any)>
Si les deux tables utilisent le même ID ou ont une clé UNIQUE commune:
1) Insérer l'enregistrement sélectionné dans le tableau 2
INSERT INTO table2 SELECT * FROM table1 WHERE (conditions)
2) Supprimer l'enregistrement sélectionné de la table1 si présente dans la table2
DELETE FROM table1 as A, table2 as B WHERE (A.conditions) AND (A.ID = B.ID)
Voici comment le faire avec une seule instruction
WITH deleted_rows AS (
DELETE FROM source_table WHERE id = 1
RETURNING *
)
INSERT INTO destination_table
SELECT * FROM deleted_rows;
EXEMPLE:
postgres=# select * from test1 ;
id | name
----+--------
1 | yogesh
2 | Raunak
3 | Varun
(3 rows)
postgres=# select * from test2;
id | name
----+------
(0 rows)
postgres=# WITH deleted_rows AS (
postgres(# DELETE FROM test1 WHERE id = 1
postgres(# RETURNING *
postgres(# )
postgres-# INSERT INTO test2
postgres-# SELECT * FROM deleted_rows;
INSERT 0 1
postgres=# select * from test2;
id | name
----+--------
1 | yogesh
(1 row)
postgres=# select * from test1;
id | name
----+--------
2 | Raunak
3 | Varun
Vous pouvez utiliser "partitionnement logique" pour basculer les données entre les tables:
En mettant à jour la colonne de Partition, les données seront automatiquement déplacées vers l'autre table:
Voici l'échantillon:
CREATE TABLE TBL_Part1
(id INT NOT NULL,
val VARCHAR(10) NULL,
PartitionColumn VARCHAR(10) CONSTRAINT CK_Part1 CHECK(PartitionColumn = 'TBL_Part1'),
CONSTRAINT TBL_Part1_PK PRIMARY KEY(PartitionColumn, id)
);
CREATE TABLE TBL_Part2
(id INT NOT NULL,
val VARCHAR(10) NULL,
PartitionColumn VARCHAR(10) CONSTRAINT CK_Part2 CHECK(PartitionColumn = 'TBL_Part2'),
CONSTRAINT TBL_Part2_PK PRIMARY KEY(PartitionColumn, id)
);
GO
CREATE VIEW TBL(id, val, PartitionColumn)
WITH SCHEMABINDING
AS
SELECT id, val, PartitionColumn FROM dbo.TBL_Part1
UNION ALL
SELECT id, val, PartitionColumn FROM dbo.TBL_Part2;
GO
--Insert sample to TBL ( will be inserted to Part1 )
INSERT INTO TBL
VALUES(1, 'rec1', 'TBL_Part1');
INSERT INTO TBL
VALUES(2, 'rec2', 'TBL_Part1');
GO
--Query sub table to verify
SELECT * FROM TBL_Part1
GO
--move the data to table TBL_Part2 by Logical Partition switching technique
UPDATE TBL
SET
PartitionColumn = 'TBL_Part2';
GO
--Query sub table to verify
SELECT * FROM TBL_Part2