關於SQL Server資料庫中的對象命名的唯一性問題。例如表、索引、約束等資料庫對象,有時候DBA在做資料庫維護時,經常要創建對象或重命名對象,此時就會遇到一個問題,對象命名的唯一性問題。雖然是一個小小的問題,估計不少人搞不清,在看文章前,你可以先回答幾個問題 1: 表名在資料庫是不是唯一? 不同... ...
關於SQL Server資料庫中的對象命名的唯一性問題。例如表、索引、約束等資料庫對象,有時候DBA在做資料庫維護時,經常要創建對象或重命名對象,此時就會遇到一個問題,對象命名的唯一性問題。雖然是一個小小的問題,估計不少人搞不清,在看文章前,你可以先回答幾個問題
1: 表名在資料庫是不是唯一? 不同的Schema下,是否可以存在同名的表?
2: 索引名在資料庫是不是唯一? 不同的Schema下,是否可以存在同名的表?
3: 其它資料庫對象呢? 例如約束、觸發器。
那麼我們接下來看看實驗例子吧,如下所示,AdventureWorks2014資料庫中存在命名為“Production.Product”的表
USE AdventureWorks2014;
GO
SELECT * FROM sys.objects WHERE OBJECT_ID =OBJECT_ID('Production.Product')
此時創建同名的表,就與遇到“There is already an object named 'Product' in the database.”這個錯誤。如下所示:
CREATE TABLE Production.Product
(
name NVARCHAR(32)
)
另外,如果我將這個表對象創建在預設的Scheme(dbo)下麵,那麼這個是沒有什麼問題的。如下所示:
CREATE TABLE dbo.Product
(
name NVARCHAR(32)
)
結論總結:表名在資料庫是唯一,在同一個Schema下,不允許存在相同的表名,但是不同的Schema下,是可以存在同名的表。這個很好理解,現實生活中很多這樣的例子,例如,大學寢室, 11棟宿舍樓有201命名的寢室, 13棟宿舍樓也有201命名的寢室。
下麵我們生成'Production.Product'的腳本,然後修改一下表名為Product_2020,執行腳本時就會遇到約束已經存在的錯誤提示(註意,不會一次性顯示所有約束已經存在的錯誤提示)。
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [Production].[Product_2020](
[ProductID] [int] IDENTITY(1,1) NOT NULL,
[Name] [dbo].[Name] NOT NULL,
[ProductNumber] [nvarchar](25) NOT NULL,
[MakeFlag] [dbo].[Flag] NOT NULL CONSTRAINT [DF_Product_MakeFlag] DEFAULT ((1)),
[FinishedGoodsFlag] [dbo].[Flag] NOT NULL CONSTRAINT [DF_Product_FinishedGoodsFlag] DEFAULT ((1)),
[Color] [nvarchar](15) NULL,
[SafetyStockLevel] [smallint] NOT NULL,
[ReorderPoint] [smallint] NOT NULL,
[StandardCost] [money] NOT NULL,
[ListPrice] [money] NOT NULL,
[Size] [nvarchar](5) NULL,
[SizeUnitMeasureCode] [nchar](3) NULL,
[WeightUnitMeasureCode] [nchar](3) NULL,
[Weight] [decimal](8, 2) NULL,
[DaysToManufacture] [int] NOT NULL,
[ProductLine] [nchar](2) NULL,
[Class] [nchar](2) NULL,
[Style] [nchar](2) NULL,
[ProductSubcategoryID] [int] NULL,
[ProductModelID] [int] NULL,
[SellStartDate] [datetime] NOT NULL,
[SellEndDate] [datetime] NULL,
[DiscontinuedDate] [datetime] NULL,
[rowguid] [uniqueidentifier] ROWGUIDCOL NOT NULL CONSTRAINT [DF_Product_rowguid] DEFAULT (newid()),
[ModifiedDate] [datetime] NOT NULL CONSTRAINT [DF_Product_ModifiedDate] DEFAULT (getdate()),
CONSTRAINT [PK_Product_ProductID] PRIMARY KEY CLUSTERED
(
[ProductID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
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的。
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Product_2020](
[ProductID] [int] IDENTITY(1,1) NOT NULL,
[Name] [dbo].[Name] NOT NULL,
[ProductNumber] [nvarchar](25) NOT NULL,
[MakeFlag] [dbo].[Flag] NOT NULL CONSTRAINT [DF_Product_MakeFlag] DEFAULT ((1)),
[FinishedGoodsFlag] [dbo].[Flag] NOT NULL CONSTRAINT [DF_Product_FinishedGoodsFlag] DEFAULT ((1)),
[Color] [nvarchar](15) NULL,
[SafetyStockLevel] [smallint] NOT NULL,
[ReorderPoint] [smallint] NOT NULL,
[StandardCost] [money] NOT NULL,
[ListPrice] [money] NOT NULL,
[Size] [nvarchar](5) NULL,
[SizeUnitMeasureCode] [nchar](3) NULL,