Oracle中的数据迁移

时间:2016-05-20 20:53:02

标签: sql oracle

我正在研究Oracle数据库。它有一个名为USR_INFO的表,并有以下列。

  1. U_ID
  2. U_NAME
  3. U_ROLE
  4. U_ROLE可以是“A”,“B”或“C”的值。

    现在我想创建一个名为ROLE_INFO的新表,其中包含以下列

    1. ROLE_ID
    2. ROLE_NAME
    3. ROLE_TAG
    4. 任务是在USR_INFO中查询并查找U_ROLE ==“B”,然后查找是否匹配 然后将U_ID复制到ROLE_ID,将U_NAME复制到ROLE_NAME。我想为所有行做这件事 在USR_INFO中。在这样做时,我还想在ROLE_TAG中插入“BB”。

      将所有数据复制到ROLE_INFO后完成。我想搜索U_ROLE ==“B” 在USR_INFO中删除所有这些行而不影响其他行。

      这就是我到目前为止所做的。

      创建名为ROLE_INFO的新表

      CREATE TABLE ROLE_INFO 
      (
          ROLE_ID INT,
          ROLE_NAME VARCHAR(255),
          ROLE_TAG VARCHAR(10)
      );
      

      现在进行复制,我做了这个,

      INSERT INTO ROLE_INFO (ROLE_ID, ROLE_NAME)
      
      SELECT U_ID, U_NAME
      
      FROM USR_INFO
      
      WHERE U_ROLE == "B"
      

      // 当我执行插入操作时,如何确保ROLE_TAG填充“BB”?

      删除

      DELETE FROM USR_INFO
      
      WHERE U_ROLE == "B";
      

      // 这会删除已经复制到ROLE_INFO的行吗?或者它会删除更多?

1 个答案:

答案 0 :(得分:1)

您可以通过这种方式修改插入,以在插入语句中添加“BB”(请注意单=而不是==)。同样在where子句中将"B"替换为'B'

INSERT INTO ROLE_INFO (ROLE_ID, ROLE_NAME , ROLE_TAG)
SELECT U_ID, U_NAME,'BB'
FROM USR_INFO
WHERE U_ROLE='B';

COMMIT;

DELETE FROM USR_INFO
WHERE U_ROLE='B';

COMMIT;

由于你的select语句和delete语句正在检查相同的条件,delete语句只会删除U_ROLE =“B”的行(请注意你也需要使用单个等号)。

此外,一旦执行了insert语句,就需要发出一个commit语句,以便更改持久且可见。