为啥必须将表中的至少一列(在 MySQL 中)分配为 PRIMARY KEY,以便表通过 JDBC 接受 UPDATE 和 INSERT 语句?

Posted

技术标签:

【中文标题】为啥必须将表中的至少一列(在 MySQL 中)分配为 PRIMARY KEY,以便表通过 JDBC 接受 UPDATE 和 INSERT 语句?【英文标题】:Why is it necessary to assign atleast one column in a table (in MySQL) as PRIMARY KEY for the table to accept UPDATE and INSERT statements via JDBC?为什么必须将表中的至少一列(在 MySQL 中)分配为 PRIMARY KEY,以便表通过 JDBC 接受 UPDATE 和 INSERT 语句? 【发布时间】:2009-12-18 12:08:15 【问题描述】:

还有;我可以通过 JDBC 在表内的 PRIMARY KEY 列中添加负 INT 吗?

【问题讨论】:

请尽量将您的问题限制为每个问题一个问题。 您遇到什么错误? JDBC 对主键没有要求。 @Thilo 以下链接指向我收到的异常:***.com/questions/1908646/…@Greg Hewgill 当我为一些简单的问题添加更多条款时,我有点内疚。 好的,对于可更新的结果集,您需要一个主键(用于标识要更新的行)。 @Greg Hewgill:这样我们就可以将答案限制为每个答案一个答案(抱歉,我无法抗拒)。 【参考方案1】:

没有理由在主键字段中不能有负数,除非您使用无符号整数作为其数据类型。

当您没有定义主键(或唯一索引)时,数据库服务器无法知道行是唯一的。对于数据库而言,能够将一行与另一行区分开来是非常基本的,我认为也许 mysql 的设计者可能是在强迫你这样做——我不知道,因为我不太使用 MySQL。 .. 老实说,这是我从未遇到过的问题,因为几乎我创建的每张表都有一个 PK!

【讨论】:

【参考方案2】:

为什么必须在一个表中(在 MySQL 中)分配至少一列作为 PRIMARY KEY 以便该表通过 JDBC 接受 UPDATE 和 INSERT 语句?

这不是 JDBC 限制。这是数据库限制。请查阅特定于 DB 的文档以获取答案。

还有;我可以通过 JDBC 在表内的 PRIMARY KEY 列中添加负 INT 吗?

这不是 JDBC 限制。这是数据库限制。请查阅特定于 DB 的文档以获取答案。

为了清楚起见:JDBC 在这里只是一个简单的工具,让您能够使用 Java 语言执行 SQL 语言。如果你得到java.sql包的异常,那么问题更多在于使用的错误SQL语法,或者有问题的数据库存在限制,或者在极少数情况下是DB提供的JDBC驱动程序中的错误,但它肯定不是' t 通常是由 JDBC API 引起的,正如您所想的那样。

【讨论】:

我绝对知道JDBC就像一个翻译器;但是,当我尝试在 MySQL 控制台中使用 INSERT 语句时,尽管表没有 PRIMARY KEY 列,但它成功添加了新行,但是当从 JDBC 执行相同操作时,它给出了一个异常 UpdatableResultSet 需要主键是 JDBC 限制(或者更确切地说是 MySQL JDBC 驱动程序限制)。当您通过 ResultSet 进行更新时,JDBC 不仅仅是发布 SQL 的简单工具。 @Thilo:因此,这是一个实现细节,它仍然不会使其成为 JDBC API 限制。一周后,我仍然看不到您投反对票的任何价值。度过了糟糕的一天? 投反对票的原因是我有点忘记了这个话题。刚刚恢复了。虽然你的答案应该读起来像一个解决方案,而不是 - 它目前是什么 - 更像是从规则手册中读出......但话又说回来,我的问题也不是描述性的。

以上是关于为啥必须将表中的至少一列(在 MySQL 中)分配为 PRIMARY KEY,以便表通过 JDBC 接受 UPDATE 和 INSERT 语句?的主要内容,如果未能解决你的问题,请参考以下文章

将表中字符串列的单词与另一列oracle中的字符串单词匹配

在线等。。。。SQL中如何将一个表中的某一列的数据替换到另一个表中的某一列里。

mysql 设置外键,能否将表中多个字段关联到另一个表中的同一字段

MySQL 分区表,为啥分区键必须是主键的一部分?

SQL数据库中如何将表中某一列部分负数改为正数

将表中的单个值分配给 ORACLE PL/SQL 中声明的变量时出错