你关心过数据库到底有多大吗?

本文介绍SQLServer2000中数据库、表及字段的数量限制,包括每个数据库最多能建多少张表,每张表最多能有多少个字段等详细信息。

sql server 2000,一个数据库最多能建多少张表,每张表最多能建多少个字段?

1、数据库:32767个数据库,最小为1MB,最大为1TB。   
2、表:每个数据库最多有20亿个表。   
3、列:每个表最多1024列,每列的最大字节数为8060(文本和图像列除外)。

SQL Server 的每个数据库最多可存储 20 亿个表,每个表可以有 1024 列。表的行数及总大小仅受可用存储空间的限制。每行最多可以存储 8,060 字节。如果创建具有 varchar、nvarchar 或 varbinary 列的表,并且列的字节总数超过 8,060 字节,虽然仍可以创建此表,但会出现警告信息。如果试图插入超过 8,060 字节的行或对行进行更新以至字节总数超过 8,060,将出现错误信息并且语句执行失败。 

<think>我们正在处理一个关于数据库查询的问题。用户想知道如何通过表名查找该表所属的数据库名称。 根据提供的引用,我们可以利用INFORMATION_SCHEMA.COLUMNS视图,它包含了列的信息,其中也包含了表名和数据库名(或架构名)。 但是,用户现在是通过表名来查找数据库名,而不是列名。因此,我们需要调整查询。 在SQL标准中,我们可以查询INFORMATION_SCHEMA.TABLES视图,该视图存储了数据库中所有表的信息,包括表名和所属的数据库(或架构)。 因此,我们可以这样查询: 假设我们有一个表名,例如'MyTable',我们想找出这个表属于哪个数据库(或架构),我们可以执行: SELECT TABLE_SCHEMA FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'MyTable'; 注意:TABLE_SCHEMA在这里通常表示数据库名(或架构名,具体取决于数据库系统)。在SQL Server中,它表示架构名,但通常架构名与数据库名有关联(在同一个数据库实例中,不同的架构可以属于同一个数据库)。然而,在MySQL中,TABLE_SCHEMA就是数据库名。 但是,用户的问题中提到了“数据库名称”,在MySQL中,我们可以直接使用上述查询,因为TABLE_SCHEMA列就是数据库名。 在SQL Server中,一个数据库(Database)下可以有个架构(Schema),而表是属于某个架构的。所以,如果我们想找表所在的数据库,那么实际上同一个表名可能出现在同一个数据库实例的不同数据库中。因此,上述查询返回的TABLE_SCHEMA在SQL Server中实际上是架构名,而不是数据库名。但是,在SQL Server的INFORMATION_SCHEMA.TABLES视图中,并没有直接提供数据库名的列。实际上,每个INFORMATION_SCHEMA视图都是针对当前数据库的。所以,如果我们要在整个实例中搜索,我们需要遍历所有数据库。 然而,用户的问题没有指定具体的数据库系统。所以,我们需要分情况讨论: 1. MySQL:使用上述查询,因为TABLE_SCHEMA就是数据库名。 2. SQL Server:由于INFORMATION_SCHEMA.TABLES视图只包含当前数据库的表,所以我们需要在所有数据库中搜索。可以使用以下方法: -- 使用一个脚本遍历所有数据库 DECLARE @TableName NVARCHAR(256) = 'MyTable' DECLARE @SQL NVARCHAR(MAX) = N'' SELECT @SQL = @SQL + 'SELECT ''' + name + ''' AS DatabaseName, TABLE_SCHEMA, TABLE_NAME FROM ' + QUOTENAME(name) + '.INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = @TableName UNION ALL ' FROM sys.databases WHERE state_desc = 'ONLINE' SET @SQL = LEFT(@SQL, LEN(@SQL) - 10) -- 去掉最后一个UNION ALL EXEC sp_executesql @SQL, N'@TableName NVARCHAR(256)', @TableName 但是,这个查询返回的DatabaseName就是数据库名,而TABLE_SCHEMA是架构名。 3. Oracle:在Oracle中,没有INFORMATION_SCHEMA,但是有类似的系统视图。我们可以查询ALL_TABLES或DBA_TABLES(需要有DBA权限)来获取表所属的用户(即模式)。在Oracle中,一个表属于一个用户(模式),而一个数据库实例包含个用户。通常,我们不会在Oracle中直接查询数据库名,因为一个实例就是一个数据库。所以,我们关注的是表所属的模式(schema)。查询如下: SELECT OWNER FROM ALL_TABLES WHERE TABLE_NAME = 'MYTABLE'; 注意:Oracle中表名默认是写的,如果创建时用了小写,则要用双引号括起来,这里我们通常用写。 4. PostgreSQL:类似于MySQL,我们可以使用: SELECT table_schema FROM information_schema.tables WHERE table_name = 'mytable'; 在PostgreSQL中,table_schema通常是'public',除非表在特定的模式中。而数据库名是另一个概念。实际上,在PostgreSQL中,每个数据库是独立的,跨数据库查询需要额外的扩展。所以,我们通常在一个数据库内查询模式。如果要查询表所在的数据库,那么我们需要连接到每个数据库去查询。这类似于SQL Server的跨数据库查询。 考虑到用户的问题可能针对不同的数据库系统,我们需要给出一个通用的方法,但通常需要根据具体数据库系统调整。 因此,我们可以这样回答: 在数关系型数据库中,我们可以通过查询系统视图来获取表所属的数据库(或模式)。以下是一些常见数据库系统的查询方法: **MySQL:** ```sql SELECT TABLE_SCHEMA AS DatabaseName FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'your_table_name'; ``` **SQL Server:** 由于SQL Server的INFORMATION_SCHEMA.TABLES只针对当前数据库,所以需要查询所有数据库: ```sql -- 创建一个临时表存储结果 CREATE TABLE #Results (DatabaseName sysname, SchemaName sysname, TableName sysname) DECLARE @TableName NVARCHAR(256) = 'your_table_name' DECLARE @SQL NVARCHAR(MAX) = N' INSERT INTO #Results SELECT ''?'' AS DatabaseName, TABLE_SCHEMA, TABLE_NAME FROM [?].INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = @TableName' -- 替换?为实际数据库名,并执行 EXEC sp_MSforeachdb @SQL, N'@TableName NVARCHAR(256)', @TableName SELECT * FROM #Results DROP TABLE #Results ``` 注意:sp_MSforeachdb是一个未公开的存储过程,但通常可用。另一种方法是使用游标遍历所有数据库。 **Oracle:** ```sql SELECT OWNER AS SchemaName FROM ALL_TABLES WHERE TABLE_NAME = 'YOUR_TABLE_NAME'; ``` 在Oracle中,一个表属于一个用户(模式),而整个实例通常只有一个数据库,所以这里返回的是模式名。 **PostgreSQL:** 在一个PostgreSQL实例中,每个数据库是独立的。要跨数据库查询,我们需要使用dblink扩展,或者分别连接到每个数据库。通常,我们只查询当前数据库: ```sql SELECT table_catalog AS DatabaseName, table_schema AS SchemaName FROM information_schema.tables WHERE table_name = 'your_table_name'; ``` 这里table_catalog是数据库名,table_schema是模式名。 由于用户的问题没有指定数据库系统,我们可以给出一个通用的思路:查询系统表或视图,这些视图通常包含表名和所属的数据库(或模式)信息。 另外,根据引用[1]中的例子,我们也可以参考其方法,但引用[1]是通过列名找表名,同时它只返回了表名,没有返回数据库名。但是,在引用[1]的查询中,我们也可以同时选择TABLE_SCHEMA(在MySQL中)来获取数据库名。所以,如果用户是通过列名找数据库名,我们可以修改引用[1]的查询为: ```sql SELECT TABLE_SCHEMA AS DatabaseName, TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = 'your_column_name'; ``` 但是,现在用户是通过表名找数据库名,所以我们不需要列名条件,而是表名条件。 因此,总结回答如下: 要查询一个表名所属的数据库名称,我们可以根据不同的数据库系统使用不同的系统视图进行查询。以下是一些常见数据库系统的查询方法: 1. **MySQL**: ```sql SELECT TABLE_SCHEMA AS DatabaseName FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'your_table_name'; ``` 2. **SQL Server** (跨数据库查询): ```sql -- 方法1:使用sp_MSforeachdb(未公开但通常可用) CREATE TABLE #Results (DatabaseName sysname, SchemaName sysname, TableName sysname); DECLARE @TableName NVARCHAR(256) = 'your_table_name'; DECLARE @SQL NVARCHAR(MAX) = N' INSERT INTO #Results SELECT ''?'' AS DatabaseName, TABLE_SCHEMA, TABLE_NAME FROM [?].INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = @TableName'; EXEC sp_MSforeachdb @SQL, N'@TableName NVARCHAR(256)', @TableName; SELECT * FROM #Results; DROP TABLE #Results; ``` ```sql -- 方法2:使用游标(更标准) DECLARE @DBName sysname, @SQL NVARCHAR(MAX); DECLARE @TableName NVARCHAR(256) = 'your_table_name'; DECLARE @Results TABLE (DatabaseName sysname, SchemaName sysname, TableName sysname); DECLARE db_cursor CURSOR FOR SELECT name FROM sys.databases WHERE state_desc = 'ONLINE'; OPEN db_cursor; FETCH NEXT FROM db_cursor INTO @DBName; WHILE @@FETCH_STATUS = 0 BEGIN SET @SQL = N' INSERT INTO @Results SELECT ''' + @DBName + ''', TABLE_SCHEMA, TABLE_NAME FROM ' + QUOTENAME(@DBName) + N'.INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = @TableName'; EXEC sp_executesql @SQL, N'@TableName NVARCHAR(256)', @TableName; FETCH NEXT FROM db_cursor INTO @DBName; END CLOSE db_cursor; DEALLOCATE db_cursor; SELECT * FROM @Results; ``` 3. **Oracle**: ```sql SELECT OWNER AS SchemaName FROM ALL_TABLES WHERE TABLE_NAME = 'YOUR_TABLE_NAME'; ``` 注意:在Oracle中,通常一个实例对应一个数据库,所以这里返回的是模式(用户)名,而不是数据库名。如果需要数据库名,可以查询全局数据库名(GLOBAL_NAME): ```sql SELECT * FROM GLOBAL_NAME; ``` 但是,这个全局数据库名是实例级别的,所以所有表都在这个数据库名下。因此,我们通常更关心表所在的模式(OWNER)。 4. **PostgreSQL**: ```sql SELECT table_catalog AS DatabaseName, table_schema AS SchemaName FROM information_schema.tables WHERE table_name = 'your_table_name'; ``` 注意:这个查询只针对当前数据库。要查询整个PostgreSQL集群中的所有数据库,需要分别连接到每个数据库执行,或者使用dblink扩展。 由于不同数据库系统的实现不同,请根据实际使用的数据库系统选择相应的查询方法。 另外,用户可能在一个数据库实例中有数据库,所以通过表名查询时,可能会返回个结果(如果数据库中有同名的表)。 最后,根据要求,我们需要生成相关问题: 1. 如何查询一个表的所有列信息? 2. 如何查询一个数据库中的所有表名? 3. 如何查询一个表的主键信息? 4. 如何查询一个表的索引信息? 注意:引用[1]和引用[2]的内容仅供参考,我们在回答中并没有直接使用引用[2](关于触发器)的内容,因为用户的问题是关于表名和数据库名的。</think>### 通过表名查找所属数据库名称的方法 在关系型数据库中,可以通过系统视图或元数据表查询表名对应的数据库名称。以下是不同数据库系统的实现方法: #### 1. **SQL Server** ```sql SELECT TABLE_CATALOG AS DatabaseName, TABLE_SCHEMA AS SchemaName, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'YourTableName'; -- 替换为实际表名 ``` - **说明**: `TABLE_CATALOG` 字段表示数据库名称,`TABLE_SCHEMA` 表示架构名(如 `dbo`)。 此视图包含当前数据库实例中所有数据库的表信息[^1]。 #### 2. **MySQL/MariaDB** ```sql SELECT TABLE_SCHEMA AS DatabaseName, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'your_table_name'; -- 替换为实际表名 ``` - **说明**: `TABLE_SCHEMA` 字段直接对应数据库名称。 #### 3. **Oracle** ```sql SELECT OWNER AS SchemaName, TABLE_NAME FROM ALL_TABLES WHERE TABLE_NAME = 'YOUR_TABLE_NAME'; -- 表名需写 -- 若需数据库名(全局名称): SELECT GLOBAL_NAME FROM GLOBAL_NAME; ``` - **说明**: Oracle 中一个实例通常对应一个数据库,`OWNER` 表示表所属的**用户/模式**。 全局数据库名需单独查询 `GLOBAL_NAME` 视图[^2]。 #### 4. **PostgreSQL** ```sql SELECT table_catalog AS DatabaseName, table_schema AS SchemaName, table_name FROM information_schema.tables WHERE table_name = 'your_table_name'; ``` --- ### 关键注意事项 1. **权限要求**: 需用户具有访问系统视图的权限(如 SQL Server 的 `VIEW ANY DEFINITION`)。 2. **小写敏感**: - Oracle 表名默认**写**,其他数据库通常**小写**(取决于安装配置)。 3. **跨数据库查询**: SQL Server 需访问 `INFORMATION_SCHEMA.TABLES` 的**完整路径**(如 `OtherDB.INFORMATION_SCHEMA.TABLES`)。 > 示例:查找表 `Employees` 所属数据库 > ```sql > -- SQL Server > SELECT TABLE_CATALOG FROM INFORMATION_SCHEMA.TABLES > WHERE TABLE_NAME = 'Employees'; > ``` > 结果: > | DatabaseName | > |--------------| > | HR_Database | --- ### 相关问题 1. 如何查询一个数据库中所有的表名和所属架构? 2. 如何通过列名查找包含该列的所有表? 3. 不同数据库系统(如 SQL Server 与 Oracle)的元数据查询有何差异? 4. 如何批量导出数据库中所有表的结构信息? [^1]: 系统视图 `INFORMATION_SCHEMA` 是 SQL 标准提供的元数据查询接口,包含表、列等对象信息。 [^2]: Oracle 的 `GLOBAL_NAME` 视图存储数据库全局标识符,`ALL_TABLES` 提供用户可访问的表信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值