J.D*_*.D. 2 foreign-key sql-server sql-server-2008-r2 table
如果该表被重命名,表上的外键关系会发生什么变化?
重命名表不会更改该表的基础 object_id。使用 object_id 跟踪外键关系。
看一看中的信息select * from sys.foreign_keys。
假设以下父/子表
DROP TABLE IF EXISTS [dbo].[QueueDatabase];
DROP TABLE if exists [dbo].[Queue];
GO
CREATE TABLE [dbo].[Queue](
[QueueID] [int] IDENTITY(1,1) NOT NULL,
[SchemaName] [sysname] NOT NULL,
[ObjectName] [sysname] NOT NULL,
[Parameters] [nvarchar](max) NOT NULL,
[QueueStartTime] [datetime] NULL,
[SessionID] [smallint] NULL,
[RequestID] [int] NULL,
[RequestStartTime] [datetime] NULL,
CONSTRAINT [PK_Queue] PRIMARY KEY CLUSTERED
(
[QueueID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
CREATE TABLE [dbo].[QueueDatabase](
[QueueID] [int] NOT NULL,
[DatabaseName] [sysname] NOT NULL,
[DatabaseOrder] [int] NULL,
[DatabaseStartTime] [datetime] NULL,
[DatabaseEndTime] [datetime] NULL,
[SessionID] [smallint] NULL,
[RequestID] [int] NULL,
[RequestStartTime] [datetime] NULL,
CONSTRAINT [PK_QueueDatabase] PRIMARY KEY CLUSTERED
(
[QueueID] ASC,
[DatabaseName] 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
ALTER TABLE [dbo].[QueueDatabase] WITH CHECK ADD CONSTRAINT [FK_QueueDatabase_Queue] FOREIGN KEY([QueueID])
REFERENCES [dbo].[Queue] ([QueueID])
GO
ALTER TABLE [dbo].[QueueDatabase] CHECK CONSTRAINT [FK_QueueDatabase_Queue]
GO
Run Code Online (Sandbox Code Playgroud)
现在,开始交易。在执行 sp_rename 之前和之后选择 object_id's 和 object_names。object_names 更改,但底层 object_id 保持不变。
begin transaction
--select object_id's and names before table rename
SELECT parent_object_id AS child_table_id
,object_name(parent_object_id) AS child_table
,referenced_object_id AS parent_table_id
,object_name(referenced_object_id) AS parent_table
FROM sys.foreign_keys
--rename the table
exec sp_rename 'dbo.queuedatabase','newqueuedatabase'
--select object_id's and names after table rename
SELECT parent_object_id AS child_table_id
,object_name(parent_object_id) AS child_table
,referenced_object_id AS parent_table_id
,object_name(referenced_object_id) AS parent_table
FROM sys.foreign_keys
--rollback
Run Code Online (Sandbox Code Playgroud)
- 前
| child_table_id | child_table | parent_table_id | parent_table |
|----------------|---------------|-----------------|--------------|
| 1100687119 | QueueDatabase | 1068687005 | Queue |
Run Code Online (Sandbox Code Playgroud)
- 后
| child_table_id | child_table | parent_table_id | parent_table |
|----------------|------------------|-----------------|--------------|
| 1100687119 | newqueuedatabase | 1068687005 | Queue |
Run Code Online (Sandbox Code Playgroud)
此外,应该注意的name是,外键的没有发生任何神奇的事情(假设您使用表名作为外键名的一部分)
选择 fromsys.foreign_keys显示名称保持不变,即使现在有点混乱,因为重命名后没有名为 QueueDatabase 的表。
FK_QueueDatabase_Queue
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1751 次 |
| 最近记录: |