【问题标题】:add new column if the previous one is not null如果前一列不为空,则添加新列
【发布时间】:2019-10-15 14:49:47
【问题描述】:

我需要创建 sqlite 语句来检查特定列的值是否不为空,然后添加一个新列并插入新值。

我已经拥有的是这个:

CREATE TABLE "StuPayment" (
    "PayNumber" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
    "StudentName"   ntext,
    "CourseName"    ntext,
    "PayDate"   datetime,
    "CheckNumber"   NUMERIC,
    "Amount"    NUMERIC
)

我想要创建一个新的付款列(PayDate1,CheckNumber1,Amount1),当学生支付两笔或有时三笔的课程费用时。 感谢您抽出宝贵时间阅读本文。

【问题讨论】:

  • 我建议创建一个新行而不是更多列。当您的付款越来越多时,添加一列将是一场噩梦。
  • 我想过,但问题是一年后表格可能多达 10000 行,这很难过滤或创建报告,谢谢你的前任
  • 关系数据库是基于关系建模的。您的方法忽略了每个学生可以进行多次付款,这意味着每个学生有很多付款行。根据需要过滤非常简单 - 例如日期或序列号
  • 10,000 行并不是很多。每次付款时,您都会一遍又一遍地维护添加列的时间会更糟。此外,对于报告,您可以使用 group by 和其他工具进行查询,以您建议的相同格式提取数据。以这种方式设计桌子并不是最佳选择。
  • 有没有办法使用 sqlite 对共享相同 StudentName 和 CourseName 的行进行分组?

标签: c# sql sqlite insert alter


【解决方案1】:

没有。不要这样做。只需将付款记录在多行中。您已经有一个datetime 列,因此每次付款都会单独记录。

新行有多个优点:

  • 您可以轻松搜索amount > 1000 之类的内容,而不必担心额外的列。
  • 您可以使用索引来搜索付款列,例如获取特定日期的所有付款。
  • PayNumber 唯一标识每笔付款。
  • 您不必为所有行中的空值保留空间。
  • 添加新的付款方式(例如信用卡、借记卡、直接借记卡或其他机制)更简单,因为您不必为每个潜在的付款增加列。
  • 您可以更轻松地支持付款计划,例如每周付款一次。

您对 10,000 行/年的担忧与当今世界无关。数据库和计算机功能强大。

如果您想查看学生支付的所有款项,您可以使用:

select studentname, coursename, count(*) as numpayments, sum(amount)
from stupayment
group by studentname, coursename;

【讨论】:

    【解决方案2】:

    我建议创建一个视图并执行您想要的任何操作,因为我认为逻辑要求不明确。去查看创作

       Create view as (Select * from table) ;
       Alter view add column c1 ;
    

    【讨论】:

    • 还是谢谢你,但我想我会选择上一个答案
    • 是的,没问题,这与我要求更改原始表结构的原因相同,以行的形式添加是您唯一应该做的事情
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多