编写SQL脚本以插入数据

时间:2012-05-11 07:42:31

标签: sql postgresql insert sql-scripts

在包含许多表的数据库中,如果数据不存在,我需要编写一个SQL脚本来插入数据。

货币

| id     | Code    | lastupdate | rate      |
+--------+---------+------------+-----------+
| 1      | USD     | 05-11-2012 | 2         |
| 2      | EUR     | 05-11-2012 | 3         |

客户端

| id     | name    | createdate | currencyId|
+--------+---------+------------+-----------+
| 4      | tony    | 11-24-2010 | 1         |
| 5      | john    | 09-14-2010 | 2         |

表:帐户

| id     | number  | createdate | clientId  |
+--------+---------+------------+-----------+
| 7      | 1234    | 12-24-2010 | 4         |
| 8      | 5648    | 12-14-2010 | 5         |

我需要插入:

  1. currencyid=3, Code=JPY, lastupdate=today, rate=4
  2. clientid=6, name=Joe, createdate=today, currencyId=Currency with Code 'USD'
  3. accountid=9, number=0910, createdate=today, clientId=Client with name 'Joe'
  4. 问题:

    1. 脚本必须在插入新数据之前检查行是否存在
    2. 脚本必须允许我们将外键添加到新行中,该外键与已在数据库中找到的行相关(在客户端表中作为currencyId)
    3. 脚本必须允许我们将当前日期时间添加到insert语句中的列(例如createdate表中的client
    4. 脚本必须允许我们将外键添加到新行,其中该外来词与插入同一脚本中的行相关(例如clientId表中的account
    5. 注意:我尝试了以下SQL语句,但它只解决了第一个问题

      INSERT INTO Client (id, name, createdate, currencyId)
      SELECT 6, 'Joe', '05-11-2012', 1
      WHERE not exists (SELECT * FROM Client where id=6);
      

      此查询运行时没有任何错误,但正如您可以看到我手动编写createdatecurrencyid,我需要从带有where子句的select语句中获取货币ID(我试图用select替换1)声明但查询失败了。)

      这是一个关于我需要的例子,在我的数据库中,我需要这个脚本在超过10个表中插入超过30行。

      任何帮助

2 个答案:

答案 0 :(得分:0)

你写了

  

我尝试用select语句替换1但查询失败

但我想知道为什么会失败?你尝试了什么?这应该有效:

INSERT INTO Client (id, name, createdate, currencyId)
SELECT 
    6, 
    'Joe', 
    current_date, 
    (select c.id from currency as c where c.code = 'USD') as currencyId
WHERE not exists (SELECT * FROM Client where id=6);

答案 1 :(得分:0)

如果数据存在,您似乎可以解决问题。 以下是SQL Server / Sybase编写的一小段代码,我认为这些代码可以解答您的基本问题:

create table currency(
    id numeric(16,0) identity primary key,
    code varchar(3) not null,
    lastupdated datetime not null,
    rate smallint
);

create table client(
    id numeric(16,0) identity primary key,
    createddate datetime not null,
    currencyid numeric(16,0) foreign key references currency(id)
);

insert into currency (code, lastupdated, rate)
values('EUR',GETDATE(),3)

--inserts the date and last allocated identity into client
insert into client(createddate, currencyid)
values(GETDATE(), @@IDENTITY)

go