Mover os dados SQL de uma tabela para outra
estava a pensar se é possível mover todas as linhas de dados de uma tabela para outra, que correspondem a uma determinada consulta?
por exemplo, eu preciso mover todas as linhas da tabela de Table1 para Table2 onde seu nome de usuário = 'X' e senha = 'X', para que eles não mais apareçam no Table1.
Estou a usar o SQL Server 2008 Management Studio.12 answers
Deve ser possível utilizar duas declarações numa transacção, uma inserção e uma supressão:
INSERT INTO Table2 (<columns>)
SELECT <columns>
FROM Table1
WHERE <condition>;
DELETE FROM Table1
WHERE <condition>;
COMMIT;
Esta é a forma mais simples. Se tiver de se preocupar com a inserção de novos registos correspondentes no quadro 1 entre as duas declarações, poderá adicionar um and exists <in table2>
.
Como alguns mencionaram, realizar um INSERT
e depois um DELETE
pode levar a problemas de integridade, então talvez uma maneira de contorná-lo, e para executar tudo de forma limpa em uma única declaração, é tirar vantagem da tabela temporária [deleted]
.
DELETE FROM [source]
OUTPUT [deleted].<column_list>
INTO [destination] (<column_list>)
Todas estas respostas executam a mesma consulta para inserir e apagar. Como mencionado anteriormente, isso corre o risco de a remoção pegar registros inseridos entre declarações e poderia ser lento se a consulta é complexa (embora motores inteligentes "deve" fazer a segunda chamada rápida).
A forma correcta (assumindo que a inserção está numa tabela nova) é apagar com o quadro 1 usando o campo de chaves do quadro 2.
A supressão deve ser:
DELETE FROM tbl_OldTableName WHERE id in (SELECT id FROM tbl_NewTableName)
Desculpa a sintaxe, estou a saltar. entre motores, mas já percebeste a ideia.
INSERT INTO Table2 (UserName,Password)
SELECT UserName,Password FROM Table1 WHERE UserName='X' AND Password='X'
Depois apaga os orginals
DELETE FROM Table1 WHERE UserName='X' AND Password='X'
Pode querer preservar UserID
ou qualquer outra chave primária, depois pode usar IDENTITY INSERT
para preservar a chave.
Tenta isto
INSERT INTO TABLE2 (Cols...) SELECT Cols... FROM TABLE1 WHERE Criteria
Depois
DELETE FROM TABLE1 WHERE Criteria
Você deve ser capaz de o fazer com um subquery na instrução inserir.
INSERT INTO table1(column1, column2) SELECT column1, column2 FROM table2 WHERE ...;
Seguido de remoção do quadro 1.
Lembre-se de executá-la como uma única transacção para que, se alguma coisa correr mal, possa voltar a fazer a operação.Podes tentar isto:
SELECT * INTO tbl_NewTableName
FROM tbl_OldTableName
WHERE Condition1=@Condition1Value
Depois execute uma remoção simples:
DELETE FROM tbl_OldTableName
WHERE Condition1=@Condition1Value
Use esta instrução sql única, que é segura sem necessidade de commit/rollback com várias declarações.
INSERT Table2 (
username,password
) SELECT username,password
FROM (
DELETE Table1
OUTPUT
DELETED.username,
DELETED.password
WHERE username = 'X' and password = 'X'
) AS RowsToMove ;
Funciona no servidor SQL faça as alterações apropriadas para o MySql
DELETE sourceTable
OUTPUT DELETED.*
INTO destTable (Comma, separated, list, of, columns)
WHERE <conditions (if any)>
Se as duas tabelas usarem o mesmo ID ou tiverem uma chave única comum:
1) inserir o registo seleccionado no quadro 2
INSERT INTO table2 SELECT * FROM table1 WHERE (conditions)
2) apagar o registo seleccionado do quadro 1 se apresentar no quadro 2
DELETE FROM table1 as A, table2 as B WHERE (A.conditions) AND (A.ID = B.ID)
Aqui está como fazê-lo com uma única declaração
WITH deleted_rows AS (
DELETE FROM source_table WHERE id = 1
RETURNING *
)
INSERT INTO destination_table
SELECT * FROM deleted_rows;
Exemplo:
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
Pode utilizar "particionamento lógico" para mudar os dados entre tabelas:
Ao actualizar a coluna de Partição, os dados serão automaticamente movidos para a outra tabela:
Aqui está a amostra:
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