【问题标题】:Declare a table has a column that is the product of two columns声明一个表有一列是两列的乘积
【发布时间】:2015-02-26 23:59:47
【问题描述】:

餐桌产品

id  name   price   quantity   total

1     food    50      1         50
2     drink   20      2         40
3     dress   100     3         300

如何声明一个表的列是两列的乘积?

我有这个代码:

CREATE TABLE [dbo].[Orders] (
    [Id]          INT        IDENTITY (1, 1) NOT NULL,
    [ProductName] NCHAR (70) NULL,
    [Price]       INT        NULL,
    [Quantity]    INT        NULL,
    [Total] INT NULL, 
    PRIMARY KEY CLUSTERED ([Id] ASC)
);

【问题讨论】:

  • 你真的想要一个字段来存储total——也许这更适合在你的sql或view中计算?如果您确实想要 computed column,请声明如下:[Total] INT AS (Price * Quantity)
  • [Total] INT AS (Price * Quantity), 在 C# 中的 T-SQL 中使用 AS 时出现错误
  • 也许您想要一个单独的表来存储乘法表?
  • 不,我在这张桌子上。并且不要使用此代码ALTER TABLE [Orders] ADD TOT INT AS Price * Quantity; :(

标签: mysql sql tsql


【解决方案1】:

听起来你想要VIEW

他们的例子正是你所描述的

mysql> CREATE TABLE t (qty INT, price INT);
mysql> INSERT INTO t VALUES(3, 50);
mysql> CREATE VIEW v AS SELECT qty, price, qty*price AS value FROM t;
mysql> SELECT * FROM v;
+------+-------+-------+
| qty  | price | value |
+------+-------+-------+
|    3 |    50 |   150 |
+------+-------+-------+

【讨论】:

    【解决方案2】:

    你可以试试这个伙伴:

    DROP TRIGGER IF EXISTS trg_product_total;
    DELIMITER //
    CREATE TRIGGER trg_product_total AFTER INSERT ON product
    FOR EACH ROW BEGIN
      SET @price = NULL, @quantity = NULL;  
    
      SELECT price INTO @price FROM product
      WHERE id = NEW.id;  
    
      SELECT quantity INTO @quantity
      WHERE id = NEW.id;  
    
      UPDATE product SET total = @price * @quantity
      WHERE id = NEW.id;
    END;
    

    如果您真的不想在将 product.total 插入数据库之前对其进行处理,则可以使用这种方法。

    触发器将在每次向表中添加新记录时执行,其中根据您的默认值,总列的预期插入是“NULL”或“0”。

    但我认为如果在插入之前计算它会更好。

    流程是这样的:

    Application side
    1. get price and quantity for the product
    2. calculate for the total
    3. insert values into the query
    4. execute query
    

    如果您想了解有关 MySQL 触发器的更多信息:Link
    另外,PHP 事务:Link

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-02
      • 1970-01-01
      • 2019-03-04
      • 1970-01-01
      • 2015-06-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多