我想知道为什么我应该使用 int 作为查找表的主键,而不是仅仅使用查找值作为主键(在大多数情况下是一个字符串)。
我知道使用 nvarchar(50) 而不是 int 会使用更多的空间,如果它链接到一个有很多记录的表。
另一方面,直接使用查找值基本上可以避免我们进行连接。我可以想象,如果总是需要加入,这将是一个很大的节省(我们正在开发一个网络应用程序,所以这很重要)。
除了“标准操作”之外,使用 int 主键(特别是对于查找表)有什么优势?
我有一个带字段的表
员工ID
废话
blahblah2
.....
记录月
记录年
那么如何设置表格,以便 EmployeeID 可以每月更新一次,但永远不能有两个匹配的月份和年份的条目?
我想修改 SQL Azure 表上的现有主键。
它目前只有一列,我想添加另一列。
现在,在 SQL Server 2008 上这是小菜一碟,只是在 SSMS 中做到了,噗。完毕。如果我从 SQL Server 编写 PK,这就是 PK 的样子:
ALTER TABLE [dbo].[Friend] ADD CONSTRAINT [PK_Friend] PRIMARY KEY CLUSTERED
(
[UserId] ASC,
[Id] ASC
)
Run Code Online (Sandbox Code Playgroud)
但是,在 SQL Azure 上,当我尝试执行上述操作时,它当然会失败:
Table 'Friend' already has a primary key defined on it.
很好,所以我试着放下钥匙:
Tables without a clustered index are not supported in this version of SQL Server. Please create a clustered index and try again.
好的,所以我尝试创建一个临时聚集索引以删除 PK:
CREATE CLUSTERED INDEX IX_Test ON [Friend] ([UserId],[Id])
Run Code Online (Sandbox Code Playgroud)
结果是: …
我有一个大数据库,需要从每个表中提取所有主键和外键。
我有 pgAdmin III。
有没有办法自动执行此操作而不手动查看每个表?
查看数据库,我遇到了一个表,该表使用其主键作为其自身的外键。
我已经看到一个表可以有一个自身的外键来构建层次结构,但它会使用另一列来引用主键。
由于主键是唯一的,在这种情况下,该行不是只能指向自身吗?这似乎是一个同义反复的链接,因为如果我已经有了该行,那么我已经有了该行。
有什么理由这样做吗?

我确信约束是这样写的(不仅仅是查看图表),因为相同的表和列用于定义的两半。
我是 DBMS 的新手,我仍在学习理论。
我对这个关键业务感到非常困惑,在谷歌搜索之后,我将它缩小到只有 2 个我没有得到的键(主键和超级键)。
我有几个关于 DBMS 的问题。如果您能为我解答这些问题,我将不胜感激。
1) DBMS 中的主键和超级键有什么区别? 如果你能用一个全面的例子来正确解释,非常感谢
2)主键和超级键都可以可以有多个列组合成主键和超级键吗?
3)主键是超级键的子集,反之亦然?
从数学的角度来看,假设一个表最多有一个主键,通过任意名称而不是简单的表属性来引用主键似乎是一种短视的设计决定。
因此,要将主键从非集群更改为集群,反之亦然,您必须首先搜索其名称,而不是删除它并最终读取它。
使用我看不到的任意名称是否有一些优势,或者 DBMS 是否不使用任意名称作为主键?
编辑 2011-02-22 (对于那些不想在那里排序的人,2011 年 2 月 22 日):
让我展示一个函数,您可以使用它从表名中导出主键的名称(使用早期的 sql-sever 又名 sybase 系统表):
create function dbo.get_pk (@tablename sysname)
returns sysname
as
begin
return (select k.name
from sysobjects o
join sysobjects k on k.parent_obj = o.id
where o.name = @tablename
and o.type = 'U'
and k.type = 'k')
end
go
Run Code Online (Sandbox Code Playgroud)
正如 gbn 所说,当您不提供明确的名称时,没有人真正喜欢生成的名称:
create table example_table (
id int primary key
)
select dbo.get_pk('example_table')
Run Code Online (Sandbox Code Playgroud)
我刚得到
PK__example___3213E83F527E2E1D
Run Code Online (Sandbox Code Playgroud)
但是为什么 sysobjects 中的名称必须是唯一的。对表及其主键使用完全相同的名称是完全可以的。
这样做,我们不需要设置命名约定,这可能会被意外违反。
现在回答玛丽安:
我知道如何在表中创建主键,但如何将现有索引设为主键?我正在尝试将现有表从一个数据库复制到另一个数据库。当我显示表格时,底部的索引是这种形式:
"my_index" PRIMARY KEY, btree (column1, column2)
Run Code Online (Sandbox Code Playgroud)
我已经创建了索引:
CREATE INDEX my_index ON my_table (column1, column2)
Run Code Online (Sandbox Code Playgroud)
但我不知道如何使它成为主键......
更新:我的服务器版本是 8.3.3
MySQLUnique Key和Primary KeyMySQL之间的主要区别是什么?