【问题标题】:I have been assigned a project for currency exchange rate IN SQL . How to save exchange rates for currencies?我被分配了一个 SQL 货币汇率项目。如何保存货币汇率?
【发布时间】:2013-12-30 15:39:50
【问题描述】:

我必须创建一个表货币

CREATE TABLE currencies (
       from_currency        CHAR(30) NOT NULL,
       ExchRate             REAL NOT NULL,
       to_currency          CHAR(30) NOT NULL,
       PRIMARY KEY (from_currency),
       FOREIGN KEY (to_currency) REFERENCES currencies(from_currency)
)

我必须保存 6 种货币的汇率:(inr,eur,cad,usd,gbp,cfp) 但问题是我不能在第一列中存储相同的值 IE。 我可以保存我的货币汇率如下

from_curr      ER --> to_curr 
INR        --> 60 -->   USD
USD        --> 0  -->   USD
GBP        --> 70 -->   USD

e.t.c.对于所有货币,但现在问题是当我尝试为其他人存储货币时

INR        --> 1  -->   USD
or
GBP        --> 70 -->   USD 

我得到错误不允许重复值? 如何解决这个问题?

【问题讨论】:

  • 附带说明,您可能不应该将汇率存储为REAL,因为它是一个浮点值。除其他事项外,存储的值很可能不是输入的值,人们往往对金钱的数额感到各种紧张。因为您应该将任何金额存储在基于NUMERIC/DECIMAL 类型的东西中,所以无论如何您都应该为所有操作转换为该类型。为自己节省一些常见的转换时间。

标签: sql


【解决方案1】:

您存储的不是一种货币,而是一对货币。

CREATE TABLE currency_exchange_rates (
       from_currency        CHAR(30) NOT NULL,
       to_currency          CHAR(30) NOT NULL,
       ExchRate             REAL NOT NULL,
       PRIMARY KEY (from_currency,to_currency),
)

我还建议使用单独的表格来保存六种货币,并链接上面的表格以确保有效的货币代码。您可能还想保留一个日期字段(并使其成为主键的一部分),因为费率会随着时间而变化...

【讨论】:

    【解决方案2】:

    您应该创建一个复合主键,因为一对 2 货币为您唯一标识一条记录。

    CREATE TABLE currencies (
       from_currency        CHAR(30) NOT NULL,
       ExchRate             REAL NOT NULL,
       to_currency          CHAR(30) NOT NULL,
       PRIMARY KEY (from_currency, to_currency)
    )
    

    或者,您也可以为主键添加一个新列,例如作为自增列:

    CREATE TABLE currencies (
       [Id] [int] IDENTITY(1,1) NOT NULL
       from_currency        CHAR(30) NOT NULL,
       ExchRate             REAL NOT NULL,
       to_currency          CHAR(30) NOT NULL,
       PRIMARY KEY ([Id])
    )
    

    【讨论】:

      【解决方案3】:

      当然不能。那是因为你定义了PRIMARY KEY ()。因此,该列只允许不同的值。相反,您需要的是 from_currency/to_currency 对是唯一的。您可以通过在表中定义复合 PK 来做到这一点:

      CREATE TABLE currencies (
             from_currency        CHAR(30) NOT NULL,
             ExchRate             REAL NOT NULL,
             to_currency          CHAR(30) NOT NULL,
             PRIMARY KEY (from_currency, to_currency)
      )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-27
        • 1970-01-01
        • 2021-01-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多