Skip to main content

Query to find column constraints Primary Key, Foreign Key, Check, Not Null and Unique

It is always a question that how do I know what constraints are there on each column of a table. Following query gives access to this information,

SELECT a.table_name,a.column_name,a.constraint_name, b.constraint_type, b.search_condition
FROM USER_CONS_COLUMNS a, USER_CONSTRAINTS b
WHERE a.constraint_name = b.constraint_name
ORDER BY a.table_name;


Above query returns all the tables and all its columns with some constraints.

CONSTRAINT_TYPE column in table USER_CONSTRAINTS store information about what type of constraint a column is. The mapping goes this way,

1. C --> Check/Not Null
2. P --> Primary Key
3. R --> Foreign Key
4. U --> Unique

Since CONSTRAINT_TYPE defines both CHECK and NOT NULL as C, Column SEARCH_CONDITION gives more details on CONSTRAINT_TYPE C.


If you are only interested only in knowing NOT NULL columns for a table then just use DESCRIBE <tablename>. This lists columns with not null constraint.


Sample output of the above query on my database is as below,








Comments

Anonymous said…
Hi Mithun, my name is Thejas your old student from Qspiders, In ORACLE Application Express, I am able to see only 10 records at a time, how to see more than 10 records, actually its showing...

More than 10 rows available. Increase rows selector to view more rows.

Where is that rows selector and how to Increase rows selector?? Pls help me out. Thank you.
Mithun Ashok said…
Hi Thejas,

Once you are under "SQL Commands" row selector is available in the same line as "RUN" button.You would see "Rows" next to it there is a pull down menu in which you can choose more than 10 rows to be applied you can choose till 100000 rows, if there are more rows than 100000 then you will have to download on to a file.

Regards,
Mithun
Anonymous said…
hi mithun this is sathish,how to find the default tables,i gave a try with show tables but it didn't word
Mithun Ashok said…
Hi Satish,

You can use the following SQL statements to find default tables,

SELECT * FROM TAB;

or

SELECT TABLE_NAME FROM USER_TABLES;
Cdclydesdale said…
Hey there......nice site u have here.....
I am a beginner in Oracle SQL
which books should I refer to ; to learn subqueries and joins?
Thanks in advance.
Rakesh N R said…
Hi ,
I wanted to know how can we retrieve a specific record from the table. lets say 3rd record. (without knowing any value in that record)
jyothi reddy said…
Hai sir,

Am Jyothi, your old student from qspiders

Can you please tell me How to write a query to find columns has BLANK values or not?? and
How to write a query to find columns has NULL values or not
Unknown said…
it is very interesting and very helpful for "Basically from non I T background students".. thanks for sharing knowledge sir...
Ganesh Gowda said…
it is very interesting and very helpful for "Basically from non I T background students".. thanks for sharing knowledge sir...
Ganesh Gowda said…
it is very interesting and very helpful for "Basically from non I T background students".. thanks for sharing knowledge sir...
Unknown said…
to find name of Not NUll constraint
DROP TABLE IBU1;
DROP TABLE IBU3;
DROP TABLE IBU5;
CREATE TABLE IBU1 AS select column_name AS C1 from all_tab_columnS where table_name='Your_Table_name' AND NULLABLE='N';
CREATE TABLE IBU3 AS SELECT CONSTRAINT_NAME,IBU1.C1 FROM ALL_CONS_COLUMNS,IBU1 WHERE ALL_CONS_COLUMNS.COLUMN_NAME=IBU1.C1 AND ALL_CONS_COLUMNS.TABLE_NAME='Your_Table_Name';
CREATE TABLE IBU5 AS SELECT CONSTRAINT_nAME FROM usER_CONSTRAINTS WHERE CONSTRAINT_TYPE='C' AND TABLE_NAME='Your_Table_Name';
SELECT IBU3.CONSTRAINT_NAME FROM IBU3,IBU5 WHERE IBU3.CONSTRAINT_NAME=IBU5.CONSTRAINT_NAME;

Popular posts from this blog

SQL Interview Questions on Subqueries

SUB Queries:
1. List the employees working in research department 2. List employees who are located in New York and Chicago
3. Display the department name in which ANALYSTS are working
4. Display employees who are reporting to JONES
5. Display all the employees who are reporting to Jones Manager
6. Display all the managers in SALES and ACCOUNTING department
7. Display all the employee names in Research and Sales Department who are having at least 1 person reporting to them
8. Display all employees who do not have any reportees
9. List employees who are having at least 2 reporting
10. List the department names which are having more than 5 employees
11. List department name having at-least 3 salesman
12. List employees from research and accounting having at-least 2 reporting
13. Display second max salary
14. Display 4th max salary
15. Display 5th max salary  -- Answer for nth Max Salary
Co-Related Subqueries:
16. Write a query to get 4th max salary from EMP table
17. Write a query to get 2nd…

Answers for SUB Queries

1. SQL> select empno, ename from emp where deptno=(select deptno from dept where dname='RESEARCH');


2. SQL> select empno, ename from emp where deptno in (select deptno from dept where loc in ('NEW YORK','CHICAGO'));

3. SQL> select dname from dept where deptno in ( select deptno from emp where job ='ANALYST');

4. SQL> select empno, ename, mgr from emp where mgr = (select empno from emp where ename='JONES');

5. SQL> select empno, ename, mgr from emp where mgr = (select mgr from emp where ename='JONES')

6. SQL> select empno, ename, job from emp where deptno in ( select deptno from dept where dname in ('SALES','ACCOUNTING'))

7. SQL> select empno, ename, job from emp where deptno in ( select deptno from dept where dname in ('SALES','RESEARCH')) and empno in (select mgr from emp)

8. SQL> select empno, ename from emp where empno not in ( select mgr from emp where mgr is not null)

9. select…

'Linux-x86_64 Error: 28: No space left on device' While trying to start the database -- Error

SQL> startup mount pfile='/tmp/initdlfasp12.ora'
ORA-27102: out of memory
Linux-x86_64 Error: 28: No space left on device


This as you can see is on Linux x86 with 64 bit processor. We got this error after we changed SGA on 10gR2 database. So was sure that this is something to do with the OS.

Parameters to check for this are shmall.

shmall is the total amount of shared memory, in pages, that the system can use at one time.

$cat /proc/sys/kernel/shmmax
53687091200

$ getconf PAGE_SIZE
4096

As per Oracle SHMALL should be set to the total amount of physical RAM divided by page size.

Our system has 64GB memory, so change kernel.shmall = 1024 * 1024 * 1024 * 64 / 4096 = 16777216


Once this value is calculated you can modify Linux system configuration file directly.

$ su - root
vi /etc/sysctl.conf file:
kernel.shmall=16777216

and

# sysctl -p

Once this is done the database was started without any problem.