oracle 主键

总结如下:

1)主键约束和唯一键约束均会隐式创建同名的唯一索引,当主键约束或者唯一键约束失效时,隐式创建的唯一索引会被删除;

2)主键约束要求列值非空,而唯一键约束和唯一索引不要求列值非空;

3)相同字段序列不允许重复创建索引;

 

 

 

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class Test {

    public static void main(String[] args) throws Throwable {
        Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521/service.name", "username", "password");
        DatabaseMetaData meta = conn.getMetaData();
        String schemaName = "SCHEMA_NAME";
        List<String> tables = listAllTableNames(meta, schemaName);
        printPrimaryKeys(schemaName, tables.iterator(), meta);
        printUniqueIndexes(schemaName, tables.iterator(), meta);
    }

    private static List<String> listAllTableNames(DatabaseMetaData meta, String schemaName) throws SQLException {
        List<String> list = new ArrayList<String>();
        ResultSet rs = meta.getTables(null, schemaName, null, new String[] { "TABLE" });
        while(rs.next()) {
            String tableName = rs.getString("TABLE_NAME");
            list.add(tableName);
        }
        return list;
    }

    private static void printPrimaryKeys(String schemaName, Iterator<String> iter, DatabaseMetaData meta) throws SQLException {
        while(iter.hasNext()) {
            String tableName = iter.next();
            ResultSet rs = meta.getPrimaryKeys(null, schemaName, tableName);
            while(rs.next()) {
                String pkName = rs.getString("PK_NAME");
                String table = rs.getString("TABLE_NAME");
                String schema = rs.getString("TABLE_SCHEM");
                String columnName = rs.getString("COLUMN_NAME");
                System.out.println("----------------------------------------");
                System.out.println("Table: " + schema + "." + table);
                System.out.println("Key Name: " + pkName);
                System.out.println("Column(s): " + columnName);
            }
        }       
    }

    private static void printUniqueIndexes(String schemaName, Iterator<String> iter, DatabaseMetaData meta) throws SQLException {
        while(iter.hasNext()) {
            String tableName = iter.next();
            boolean listUniqueIndex = true;
            ResultSet rs = meta.getIndexInfo(null, schemaName, tableName, listUniqueIndex, true);
            while(rs.next()) {
                String indexName = rs.getString("INDEX_NAME");
                String table = rs.getString("TABLE_NAME");
                String schema = rs.getString("TABLE_SCHEM");
                String columnName = rs.getString("COLUMN_NAME");
                if(indexName == null) {
                    continue;
                }
                System.out.println("****************************************");
                System.out.println("Table: " + schema + "." + table);
                System.out.println("Index Name: " + indexName);
                System.out.println("Column Name: " + columnName);
            }
        }
    }
}


主键肯定不能为空,因为主键约束的实现实际上是UNIQUE约束和NOT NULL约束的组合


当我们需要使用多个属性变量(表中的多列)联合起来作为主键,我们需要使用复合主键。复合主键要求我们编写一个复合主键类( Composite Primary Key Class )。复合主键类需要符合以下一些要求:
·复合主键类必须是public 和具备一个没有参数的构造函数 ·复合主键类的每个属性变量必须有getter/setter,如果没有,每个属性变量则必须是public 或者protected ·复合主键类必须实现java.io.serializable ·复合主键类必须实现equals()和hashcode()方法 ·复合主键类中的主键属性变量的名字必须和对应的Entity 中主键属性变量的名字相同 ·一旦主键值设定后,不要修改主键属性变量的值

UNIQUE约束要求,对于列或列组合而言,表中每行的值必须是不同的。
UNIQUE约束的怪异之处在于,可以在键列输入NULL值。在键列中,可能有任意数量的包含NULL值得行。
UNIQUE约束通过索引来实施。在定义UNIQUE约束时,Oracle将查看键列上的索引,如果不存在,就创建一个。
索引(称为B*树索引)的结构不包含NULL值,正因为如此,才允许出现多个包含null的行。
选择 WHERE key_column is NULL不使用索引(因为索引不包含NULL),因此总是导致扫描整个表。

所以说组合唯一约束的列可以全为空或某几个为空,列是否能为空是由not null约束决定的。

猜你喜欢

转载自xjf975999.iteye.com/blog/1547046