如何从数据库中的表中提取数据类型、约束(主键、外键)并保存

23 浏览
0 Comments

如何从数据库中的表中提取数据类型、约束(主键、外键)并保存

我有一个mySQL查询语句,用来从一个表中获取列的信息:\n

String sqlStr="select column_name 
from information_schema.COLUMNS 
where table_name='users' 
and table_schema='"+_db+"' 
and column_name not in ('password','version','id')"

\n在Oracle 11g数据库中,我该如何修改上述查询语句?我需要以结果集的形式获取表\'users\'的列名,排除特定的列,并指定一个模式。目前我将所有表放在我的新表空间中,那么我需要在模式名称的位置指定表空间名称吗?\n另外,是否有一个通用的HQL查询语句可以实现这个功能?在我的新Oracle数据库中(我是新手),我只有表空间名称,那么在逻辑上它是否等同于模式名称?

0
0 Comments

问题的原因是用户想要从数据库中获取表的数据类型和约束(主键、外键),并将其保存下来。然而,用户尝试使用Oracle中的desc命令来显示包含在表中的所有列,但这并不是一个完整的解决方法。原因有三个:1)desc命令不是一个查询语句;2)它不能限制/过滤返回的列;3)它是否返回一个结果集是未知的。

为了解决这个问题,可以使用SQL查询来获取表的数据类型和约束。以下是一个示例查询:

SELECT COLUMN_NAME, DATA_TYPE, CONSTRAINT_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'users';

这个查询将返回表名为'users'的所有列的列名、数据类型和约束类型。这样,用户就可以获取所需的信息,并将其保存下来。此外,用户还可以查阅有关desc命令在Oracle中无法工作的更多信息的链接,以了解更多细节。

总之,通过使用SQL查询而不是desc命令,用户可以解决从数据库中获取表的数据类型和约束的问题,并将其保存下来。这种方法更加准确和可靠。

0
0 Comments

问题的出现原因:用户需要从数据库中获取表的数据类型以及约束信息,但是在Oracle数据库中,表名是区分大小写的,因此需要找到适合的查询方式来获取这些信息。

解决方法:使用以下查询语句可以从Oracle数据库中获取表的数据类型和约束信息:

select COLUMN_NAME from ALL_TAB_COLUMNS where TABLE_NAME='MyTableName';

需要注意的是,在Oracle数据库中是区分大小写的,如果表名是小写的,可以使用以下查询语句来获取数据:

...WHERE LOWER(Table_Name) = 'mytablename';

如果表名中有大写字母,可以使用以下查询语句来获取数据:

SELECT column_name FROM all_tab_cols WHERE UPPER(Table_Name) = UPPER('tablename');

使用lower(TABLE_NAME)upper(TABLE_NAME)会要求Oracle对ALL_TAB_COLUMNS表进行全表扫描,以获取所有TABLE_NAME的值,然后再与提供的UPPER('MyTableName')进行比较。在快速测试中,这样的性能表现无法满足我的需求,因此我会坚持使用区分大小写的比较。

在Oracle中,对象名称是以大写形式存储的,可以利用这一点。如果需要“转换”大小写,请将用户输入的大小写转换为大写形式,而不是转换Oracle对象名称。例如,WHERE table_name = UPPER('my_table_name')。如果这是一段较大的代码的一部分,应该在将其传递给WHERE条件之前将用户输入转换为大写形式。

0
0 Comments

问题的出现原因是需要从数据库的表中获取数据类型和约束(主键、外键),并将其保存起来。解决方法是使用Oracle数据库中的特定表(USER_TAB_COLSALL_TAB_COLSDBA_TAB_COLS)来查询相关信息,并使用特定的SQL语句来过滤数据。另外,可以通过JDBC来实现对不同数据库的通用操作。

在Oracle数据库中,information_schema.COLUMNS的等价物为USER_TAB_COLS(对于当前用户拥有的表)、ALL_TAB_COLSDBA_TAB_COLS(对于所有用户拥有的表)。表空间与模式不等同,因此不需要提供表空间名称。如果想要查询特定用户拥有的表的列,可以通过提供模式/用户名来实现。在这种情况下,查询语句可能如下所示:

String sqlStr= "
SELECT column_name
  FROM all_tab_cols
 WHERE table_name = 'USERS'
   AND owner = '" +_db+ "'
   AND column_name NOT IN ( 'PASSWORD', 'VERSION', 'ID' )"

需要注意的是,使用这种方法存在SQL注入的风险。另外,需要将表名和列名转换为大写,因为在Oracle中,它们通常是大写的,只有在使用双引号创建时才会是小写或混合大小写。

此外,通过JDBC还可以实现对不同数据库的通用操作。可以通过以下链接找到一个通用的实现示例:kodejava.org/examples/163.html。同时,在查询语句中可能需要添加and virtual_column = 'NO'来进一步过滤数据。

0