0

我正在编写一个使用 ODBC 连接与 MySQL 数据库交互的 .NET 应用程序。我的应用程序将在启动时在数据库上创建数据库模式和表。但是,我在下面遇到了一个奇怪的无法解释的情况:

首先我的应用程序将创建下表

CREATE TABLE IF NOT EXISTS `sample` (
`item_ID` varchar(20) NOT NULL,
`item_No` int(11) NOT NULL,
`sample_col1` varchar(20) NOT NULL,
`sample_col2` varchar(20) NOT NULL,
PRIMARY KEY (`item_ID`, `item_No`)
) ENGINE=InnoDB;

填充表格

INSERT INTO sample SET item_ID='abc', item_No=1, sample_col1='', sample_col2='';
INSERT INTO sample SET item_ID='abc', item_No=2, sample_col1='', sample_col2='';

然后我使用以下代码从 .NET 应用程序中执行 SELECT 查询:

Dim query As String
query = "SELECT item_ID, item_No, sample_col1, sample_col2 FROM sample"

Dim conn As New OdbcConnection("Driver={MySQL ODBC 5.1 Driver};Server=localhost; port=3306;Database=test; User=dbuser;Password=dbpassword;Option=3;")
Dim cmd As New OdbcDataAdapter(query, conn)
Dim dt As New DataTable
cmd.FillSchema(dt, SchemaType.Source)
cmd.Fill(dt)
conn.Close()

cmd.Fill(dt)行将引发异常:“无法启用约束。一行或多行包含违反非空、唯一或外键约束的值”。

但是,如果我将表创建查询修改为:

CREATE TABLE IF NOT EXISTS `sample` (
`item_ID` varchar(20) NOT NULL,
`item_No` int(11) NOT NULL,
`sample_col1` varchar(20) NOT NULL,
`sample_col2` varchar(20) NOT NULL,
PRIMARY KEY (`item_No`,`item_ID`)  '--> Here Primary Key order is inverted
) ENGINE=InnoDB;

vb.net 代码完美运行。请注意,在第二个创建查询中,我颠倒了 PRIMARY KEY 创建的顺序。在第一个示例中,我item_ID放在第一位,而在第二个示例中,我item_No放在第一位。

有谁知道为什么会这样?从 MySQL 数据库的角度来看,第一次和第二次创建查询之间有什么区别吗?

任何输入将不胜感激。谢谢 !

4

0 回答 0