CREATE TABLE [dbo].[tb_SC]( [SNO] [varchar](12) NOT NULL,--学号 [course_id] [varchar](50) NOT NULL,--课程,例:数据库原理与应用实验191 [Grade] [varchar](50) NULL,--成绩 CONSTRAINT [PK_tb_SC] PRIMARY KEY CLUSTERED([SNO],[course_id]),--主键 -- 外键约束,表约束 FOREIGN KEY(SNO) REFERENCES [dbo].[tb_User](user_name), -- 外键约束,表约束 FOREIGN KEY(course_id) REFERENCES [dbo].[tb_Course](course_id) )怎样修改为2019SQLserver可行版本
时间: 2023-06-28 17:05:53 浏览: 104
在 SQL Server 2019 中,应该按照以下方式修改该表:
```
CREATE TABLE [dbo].[tb_SC](
[SNO] [varchar](12) NOT NULL, --学号
[course_id] [varchar](50) NOT NULL, --课程,例:数据库原理与应用实验191
[Grade] [varchar](50) NULL, --成绩
CONSTRAINT [PK_tb_SC] PRIMARY KEY CLUSTERED([SNO],[course_id]), --主键
CONSTRAINT [FK_tb_SC_tb_User] FOREIGN KEY(SNO) REFERENCES [dbo].[tb_User](user_name), --外键约束,表约束
CONSTRAINT [FK_tb_SC_tb_Course] FOREIGN KEY(course_id) REFERENCES [dbo].[tb_Course](course_id) --外键约束,表约束
);
```
其中,外键约束需要使用 `CONSTRAINT` 关键字来定义,而且应该为每个外键约束命名。
相关问题
create table DB_ADS.dbo.ADS_CheckCenter_Details_TMP as DB_ADS.dbo.ADS_CheckCenter_Details 语法有何错误
这个SQL语句的意图是在数据库DB_ADS的dbo schema中创建一个新的临时表ADS_CheckCenter_Details_TMP,它将基于现有的ADS_CheckCenter_Details表的内容。看起来语法上没有明显的错误,不过为了确认是否完全正确,我们可以检查以下几个点:
1. **表的存在**:首先要确保`ADS_CheckCenter_Details`表在`DB_ADS.dbo`中确实存在。
2. **权限**:创建临时表可能需要特定的系统权限,如db_datawriter或相应的临时表管理权限。
3. **大小限制**:如果目标表非常大,创建临时表可能受到存储引擎的内存限制,需确保有足够的空间。
4. **临时表特性**:临时表通常用于一次性操作,如果后续不再使用,需要手动删除。
如果目标表不存在、权限不足,或者担心性能影响,正确的写法应该是:
```sql
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[DB_ADS].[dbo].[ADS_CheckCenter_Details_TMP]') AND type in (N'U'))
BEGIN
CREATE TABLE [DB_ADS].[dbo].[ADS_CheckCenter_Details_TMP]
AS
SELECT * FROM [DB_ADS].[dbo].[ADS_CheckCenter_Details];
END
```
这行代码首先检查临时表是否存在,如果不存在再创建。这样可以避免不必要的资源消耗。
create function dbo.names_count(@in_name varchar(20)) returns int begin declare @c_count int; select @c_count = count(*) from takes where ID= (select ID from student where name = @in_name); return @c_count; end select dbo.names_count('Zhang') as sec_num;有什么错误
这个 SQL 函数代码看起来没有语法错误,但是存在逻辑错误。函数的目的是计算学生名字为给定值的学生在 takes 表中的记录数。但是,函数内部使用了一个子查询来查找学生的 ID,这可能会导致以下问题:
1. 子查询返回多个值时会抛出错误。
2. 如果该名字不存在,则子查询将返回 NULL,这会导致整个函数返回 NULL,而不是 0。
针对这些问题,你可以使用 TOP 1 子句来限制子查询只返回一个值,并使用 COALESCE 函数来将 NULL 值转换为 0。修改后的代码如下:
```
create function dbo.names_count(@in_name varchar(20))
returns int
begin
declare @c_count int;
select @c_count = count(*)
from takes
where ID = (
select top 1 ID
from student
where name = @in_name
);
return coalesce(@c_count, 0);
end
select dbo.names_count('Zhang') as sec_num;
```
这样,函数将始终返回一个非空的整数值,即使输入的名字不存在于 student 表中。
阅读全文