经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » MS SQL Server » 查看文章
SQL Server解惑——对象命名的唯一性小结
来源:cnblogs  作者:东骧神骏  时间:2020/11/23 11:58:35  对本文有异议

 

关于SQL Server数据库中的对象命名的唯一性问题。例如表、索引、约束等数据库对象,有时候DBA在做数据库维护时,经常要创建对象或重命名对象,此时就会遇到一个问题,对象命名的唯一性问题。虽然是一个小小的问题,估计不少人搞不清,在看文章前,你可以先回答几个问题

 

1: 表名在数据库是不是唯一? 不同的Schema下,是否可以存在同名的表?

 

2: 索引名在数据库是不是唯一? 不同的Schema下,是否可以存在同名的表?

 

3: 其它数据库对象呢? 例如约束、触发器。

 

 

那么我们接下来看看实验例子吧,如下所示,AdventureWorks2014数据库中存在命名为Production.Product的表

 

  1. USE AdventureWorks2014;
  1. GO
  1. SELECT * FROM sys.objects WHERE OBJECT_ID =OBJECT_ID('Production.Product')

 

 

此时创建同名的表,就与遇到There is already an object named 'Product' in the database.这个错误。如下所示:

 

  1. CREATE TABLE Production.Product
  1. (
  1.     name  NVARCHAR(32)
  1. )

 

clip_image001

 

 

另外,如果我将这个表对象创建在默认的Scheme(dbo)下面,那么这个是没有什么问题的。如下所示:

 

  1. CREATE TABLE dbo.Product
  1. (
  1.     name  NVARCHAR(32)
  1. )

 

 

 

结论总结:表名在数据库是唯一,在同一个Schema下,不允许存在相同的表名,但是不同的Schema下,是可以存在同名的表。这个很好理解,现实生活中很多这样的例子,例如,大学寝室, 11栋宿舍楼有201命名的寝室, 13栋宿舍楼也有201命名的寝室。

 

下面我们生成'Production.Product'的脚本,然后修改一下表名为Product_2020,执行脚本时就会遇到约束已经存在的错误提示(注意,不会一次性显示所有约束已经存在的错误提示)。

 

 

  1. SET ANSI_NULLS ON
  1. GO
  1.  
  1. SET QUOTED_IDENTIFIER ON
  1. GO
  1.  
  1. CREATE TABLE [Production].[Product_2020](
  1.     [ProductID] [int] IDENTITY(1,1) NOT NULL,
  1.     [Name] [dbo].[Name] NOT NULL,
  1.     [ProductNumber] [nvarchar](25) NOT NULL,
  1.     [MakeFlag] [dbo].[Flag] NOT NULL CONSTRAINT [DF_Product_MakeFlag]  DEFAULT ((1)),
  1.     [FinishedGoodsFlag] [dbo].[Flag] NOT NULL CONSTRAINT [DF_Product_FinishedGoodsFlag]  DEFAULT ((1)),
  1.     [Color] [nvarchar](15) NULL,
  1.     [SafetyStockLevel] [smallint] NOT NULL,
  1.     [ReorderPoint] [smallint] NOT NULL,
  1.     [StandardCost] [money] NOT NULL,
  1.     [ListPrice] [money] NOT NULL,
  1.     [Size] [nvarchar](5) NULL,
  1.     [SizeUnitMeasureCode] [nchar](3) NULL,
  1.     [WeightUnitMeasureCode] [nchar](3) NULL,
  1.     [Weight] [decimal](8, 2) NULL,
  1.     [DaysToManufacture] [int] NOT NULL,
  1.     [ProductLine] [nchar](2) NULL,
  1.     [Class] [nchar](2) NULL,
  1.     [Style] [nchar](2) NULL,
  1.     [ProductSubcategoryID] [int] NULL,
  1.     [ProductModelID] [int] NULL,
  1.     [SellStartDate] [datetime] NOT NULL,
  1.     [SellEndDate] [datetime] NULL,
  1.     [DiscontinuedDate] [datetime] NULL,
  1.     [rowguid] [uniqueidentifier] ROWGUIDCOL  NOT NULL CONSTRAINT [DF_Product_rowguid]  DEFAULT (newid()),
  1.     [ModifiedDate] [datetime] NOT NULL CONSTRAINT [DF_Product_ModifiedDate]  DEFAULT (getdate()),
  1.  CONSTRAINT [PK_Product_ProductID] PRIMARY KEY CLUSTERED 
  1. (
  1.     [ProductID] ASC
  1. )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
  1. ) ON [PRIMARY]
  1.  
  1. GO

 

 

Msg 2714, Level 16, State 5, Line 11

There is already an object named 'PK_Product_ProductID' in the database.

Msg 1750, Level 16, State 0, Line 11

Could not create constraint or index. See previous errors.

 

 

如上所示,约束也是唯一的,它跟表名一样。而且也是跟Schema有关系,如下所示,下面SQL是OK的。

 

  1. SET ANSI_NULLS ON
  1. GO
  1.  
  1. SET QUOTED_IDENTIFIER ON
  1. GO
  1.  
  1. CREATE TABLE [dbo].[Product_2020](
  1.     [ProductID] [int] IDENTITY(1,1) NOT NULL,
  1.     [Name] [dbo].[Name] NOT NULL,
  1.     [ProductNumber] [nvarchar](25) NOT NULL,
  1.     [MakeFlag] [dbo].[Flag] NOT NULL CONSTRAINT [DF_Product_MakeFlag]  DEFAULT ((1)),
  1.     [FinishedGoodsFlag] [dbo].[Flag] NOT NULL CONSTRAINT [DF_Product_FinishedGoodsFlag]  DEFAULT ((1)),
  1.     [Color] [nvarchar](15) NULL,
  1.     [SafetyStockLevel] [smallint] NOT NULL,
  1.     [ReorderPoint] [smallint] NOT NULL,
  1.     [StandardCost] [money] NOT NULL,
  1.     [ListPrice] [money] NOT NULL,
  1.     [Size] [nvarchar](5) NULL,
  1.     [SizeUnitMeasureCode] [nchar](3) NULL,
  1.     [WeightUnitMeasureCode] [nchar](3) NULL,
  1.     [Weight] [decimal](8, 2) NULL,
  1.     [DaysToManufacture] [int] NOT NULL,
  1.     [ProductLine] [nchar](2) NULL,
  1.     [Class] [nchar](2) NULL,
  1.     [Style] [nchar](2) NULL,
  1.     [ProductSubcategoryID] [int] NULL,
  1.     [ProductModelID] [int] NULL,
  1.     [SellStartDate] [datetime] NOT NULL,
  1.     [SellEndDate] [datetime] NULL,
  1.     [DiscontinuedDate] [datetime] NULL,
  1.     [rowguid] [uniqueidentifier] ROWGUIDCOL  NOT NULL CONSTRAINT [DF_Product_rowguid]  DEFAULT (newid()),
  1.     [ModifiedDate] [datetime] NOT NULL CONSTRAINT [DF_Product_ModifiedDate]  DEFAULT (getdate()),
  1.  CONSTRAINT [PK_Product_ProductID] PRIMARY KEY CLUSTERED 
  1. (
  1.     [ProductID] ASC
  1. )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
  1. ) ON [PRIMARY]
  1.  
  1. GO

 

 

结论:对于任何约束(主键约束、外键约束、默认约束等),在数据库中同一个Schema下是唯一的,不允许存在相同的约束名称,但是不同的Schema下,是可以存在同名的约束。

 

 

索引呢,你简单测试一下,就会有所发现情况有点不同。

 

 

 

  1. USE [AdventureWorks2014]
  1. GO
  1.  
  1.  
  1. CREATE UNIQUE NONCLUSTERED INDEX [AK_Product_rowguid] ON [Production].[Product_2020]
  1. (
  1.     [rowguid] ASC
  1. )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
  1. GO

 

 

为什么索引对象的唯一性是跟前面表对象有所不同呢,这个说实话,实在没有看到详细介绍,只能怀疑是跟SQL Server官方的设定、限制有关系。

 

 

SQL Server中可以存在同名的索引吗? 如果是同一个表呢?

 

答案:不同的表,可以存在同名的索引,但是同一个表,不能存在同名的索引

 

 

对于触发器而言,它跟表名、约束一样的规则。 这里限于篇幅,就不展开了,有兴趣的自行测试一下。

 

 

下面将前面的知识用表格总结一下:

 

 

相同Schema

不同Schema

Table

不能出现同名对象

可以出现同名对象

Constraint

不能出现同名对象

可以出现同名对象

Index

可以出现同名对象,但是同一个表,不能存在同名的索引

可以出现同名对象

Trigger

不能出现同名对象

可以出现同名对象

原文链接:http://www.cnblogs.com/dongshenjun/p/14021118.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号