【问题标题】:Insert into first null row插入第一个空行
【发布时间】:2016-02-25 02:28:03
【问题描述】:

我正在尝试在第一个空列中添加值。这是我的代码-

SqlCommand cmd = my_con.CreateCommand();
                    cmd.CommandText = "insert into Contents(General_Exam) values(@CC)";
                    cmd.Parameters.AddWithValue("@CC", txtAddOption.Text);
                    cmd.ExecuteNonQuery();
                    comboBoxAddOption.Items.Add(txtAddOption.Text);
                    SqlCommand cmd1 = new SqlCommand("update TOP(1) Contents SET General_Exam=@CC where General_Exam IS NULL", my_con);
                    cmd1.Parameters.AddWithValue("@CC", txtAddOption.Text);
                    cmd1.ExecuteNonQuery();

但是当我插入值时,它没有插入第一个空行,而不是插入最后一个空行。我认为这是因为 Top(1) 占据了顶行。但我想插入第一个空行有人知道我怎么能做到这一点,请告诉!先谢谢了。

【问题讨论】:

  • 您使用的是什么关系型数据库? stackoverflow.com/help/how-to-ask
  • 定义“第一个”和“最后一个”。 SQL Server 中没有保证行的隐式顺序。您需要明确标识要更新的记录,在这种情况下可能使用明确的ORDER BY
  • 我使用的是sql server management studio(SQL)
  • 扩大戴维斯评论。你需要别的东西来查看记录的顺序。可以使用最后编辑或输入的日期。您还可以查看标识列的使用。如果您正在寻找“第一条”或最旧的记录,这应该会使这变得更容易。否则,如前所述,由于排序不明确,您将得到不同的结果。
  • 是的,我想到了 ORDER BY,但我不明白 ORDER BY 我必须做什么?

标签: c# sql


【解决方案1】:

使用UPDATE TOP 1 几乎可以肯定是一个错误。如果你需要做这样的事情,你的设计就有问题。同样重要的是要注意 - 没有 ORDER BY 子句的 TOP x 永远不会发生。如果您发现自己这样做了,那么您应该回头看看您在逻辑和/或设计中犯了什么错误。

您的表应该有一个主键,并且您应该基于它来更新,而不是基于某些(目前)数据排序。

【讨论】:

  • 特别是在任何 sql server 中都未确定数据访问的顺序。因此,第一行 CAN 和 WILL 在调用之间会发生变化,尤其是在具有多个用户的更强大的机器上。
  • @Tom H 你说得对,我需要将主键添加到某个列但这只是内容表,每列内容相互独立,所以如果我添加主键,它将是 Make them依赖,它会产生更多的问题:(
  • @Rock 实际上没有。主键可以像允许标识行的 ID 列一样简单。一个表几乎必须有一个主键 - 如果您想要可靠的更新,这是 SQL 中的核心概念。
  • 这又回到了一个重要的问题——数据库设计得不好。我强烈建议您阅读一些有关数据库设计的介绍性书籍。这里的一些概念对于高效使用数据库非常重要。
  • 是的,你们俩都是对的,添加主键是 sql 中非常重要的因素,但在我的情况下,如果我添加主键,我认为这对我没有任何帮助,因为这都是独立的组件。关于设计我认为你是对的,但是我要参考什么设计我不明白:(
【解决方案2】:

这个帖子讨论了使用公用表表达式来控制update 中的order by 使用top

how can I Update top 100 records in sql server

这里也讨论过:

SQL UPDATE TOP with ORDER BY?

;WITH CTE AS 
( 
SELECT TOP 1 * 
FROM Contents 
WHERE General_Exam IS NULL
ORDER BY [Chife Complains] DESC
) 
UPDATE CTE SET General_Exam=@CC

注意:希望您可以使用ORDER BY 整理出更好的内容。 (可能与您用于显示的类型相同)

【讨论】:

  • 您的代码一次又一次地在一个空列中添加值。但是您的代码和您的链接为我的查询提供了一些想法,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-19
  • 2021-09-07
  • 1970-01-01
  • 2014-01-14
相关资源
最近更新 更多