数据库中的主键如何工作?

时间:2011-12-31 02:12:14

标签: c# sql sql-server ado.net

我正在使用datagridview来显示数据库的记录。我还有一个表单,它收集要添加到数据库的新数据。我想知道的是,一旦使用dataAdapter-DataSets将数据插入数据库中,主键是否自动生成。

我在类中有一个方法来处理不同datagridviews的所有表。客户端方法看起来像这样。

public void AddNewClient (Client client)
        {
            try
            {
                DataRow dr = dataSet.Tables["Clients"].NewRow ();
                dr[1] = client.firstName;
                dr[2] = client.lastName;
                dr[3] = client.MI;
                dr[4] = client.address;
                dr[5] = client.city;
                dr[6] = client.state;
                dr[7] = client.zipcode;
                dr[8] = client.homePhone;
                dr[9] = client.cellPhone;
                dr[10] = client.otherPhone;
                dr[11] = client.faxNumber;
                dr[12] = client.email;
                dataSet.Tables["Clients"].Rows.Add (dr);

                adapterClients.Update (dataSet, "Clients");
            }
            catch (Exception e) { throw e; }
        } 

dataSet.Tables [“Clients”]绑定到DataGridViewClients。当新记录显示在DataGridViewClients中时,没有ClientID值。但是,当我重新启动应用程序并显示DataGridViewClients时,我可以看到如何分配ClientID的新值。所以我想知道这是由SQL服务器或......自动完成的。我的意思是我真的不知道。 :)

2 个答案:

答案 0 :(得分:1)

创建数据库的人当时决定PRIMARY KEY如何工作。

声明PRIMARY KEY的一种可能(和常见)方法是使其成为INTEGER列,当新行被INSERT时,数据库引擎本身将为其创建值。在SQL Server中,此类列称为IDENTITY(其他产品可能将其称为AUTOINC,AUTONUMBER或GENERATOR列)。这可能是您数据库中发生的事情。

另一种技术是使用INTEGER字段,其中应用程序员负责创建唯一值。这不太实用,因为您必须处理多个并发用户之间的冲突。

最后,一些设计人员尝试识别一列或多列有意义的数据,这些数据保证对系统中的每个记录都是唯一的,并声明这些列的组合是PRIMARY KEY。在这种情况下,记录没有单独的编号系统; PRIMARY KEY由“真实”数据组成。

答案 1 :(得分:0)

ClientID可能是identity column。这意味着数据库会自动为每一行分配一个新编号。即使您愿意,也不允许您自己设置标识列的值。

标识列通常是主键,但并非总是如此。主键可以由唯一标识行的任何列组成。很容易看出“自动编号”或标识列符合此要求。

您可以使用以下查询列出数据库中的所有标识列:

select  t.name
,       c.name
from    sys.tables t
join    sys.columns c
on      c.object_id = t.object_id
where   c.is_identity = 1