Oracle 9i primary and foreign key constraint
I had created table in the following way
create table dept(deptno number,dname varchar2(20));
create table emp(empno number primary key,ename varchar2(25), deptno number references dept(deptno));
One can get constraint name and constraint type from user_constraints table. But I want to know name of the column of table from which column is used as foreign key in another table. How to get such information?
SQL> Select *From user_cons_columns A
2 Where Constraint_Name In (Select r_Constraint_Name
3 From User_Constraints B
4 Where Table_Name='EMP'
5 And Constraint_Type='R'
6 Group By r_Constraint_Name
7 )
8 /
OWNER CONSTRAINT_NAME TABLE_NAME COLUMN_NAME
SCOTT PK_DEPTNO DEPT DEPTNO Edited by: babaravi on Oct 5, 2009 3:34 PM
Similar Messages
-
Primary Key and Foreign Key Constraints
Hi All,
I would like to know PRIMARY KEY and FOREIGN KEY constraints on existing oracle tables. Could any one suggest me how to find out.
Thanks,
REDYou can query DBA_CONSTRAINTS to get a list of all the constraints on table A and/or table B. The documentation I linked to gives a full list of the data you can see in DBA_CONSTRAINTS, but it includes things like the referenced table name and referenced constraint name for a foreign key constraint. If A is a parent of B or B is a parent of A, you could match up the parent's primary key constraint to the child's foreign key constraint.
More generally, though, if you don't know that one of the tables is a parent of the other, figuring out how to join the two tables is probably not something that can be done using just the Oracle data dictionary. You would probably need an understanding of the data model being used to figure out what intermediate table(s) needed to be joined in order to relate rows in A to rows in B.
Justin -
Lack of Primary and Foreign Keys and Efficiency
I am reverse engineering a Maximo database. I am shock that it does not have Primary or foreign keys define for 590 out of 620 tables.
My question is does the lack of Primary and Foreign key relationships adversely impact the efficiency of an Oracle database? I think it does IBM techs do not think it does.
Anyone has the answer?does the lack of Primary and Foreign key relationships adversely impact the efficiency of an Oracle database? Not necessarily. There are many large OLTP databases that do not define PKs and FKs.
It is true that the presence of constraint defintions is used by the optimizer. However,
what matters is how the application is written and how the optimizer handles it.
Remember that Oracle Databases have been in production since before constraint definitions were introduced.
Hemant K Chitale
Edited by: Hemant K Chitale on Jun 9, 2010 10:05 AM -
Lost about 60-75% of my primary and foreign keys when Migrating from SQL Server 7
Hi All,
I did an almost successful migration between SQL Server 7.0 and Oracle9i.
What happened:
I seem to have lost my primary and foreign keys in the migration. The funny thing is when I viewed the constraints and indexes in Toad, they were there. However when I tried to enabled those constraints nothing happened.
I really don't know how I can fixed this, but I don't understand why I didn't get a warning or an error message in the Migration Workbench (latest version).
I did ignore the following errors, could that have anything to do with the keys being lost.
Failed to create User:omwb_emulation; ORA-1920: user name "OMWB_EMULATION" conflicts with another user or role name
Failed to create User:guest;ORA-01920: user name "GUEST" conflicts with another user or role name
These users do not own any objects therefore I ignored them.
Please advise
ThanksHi Joe,
Not sure why you are able to see these objects and yet not able to enable them. Did you encounter any errors during the create Oracle Model phase?? Did you encounter any errors during the final Migrate phase?
Also, it is really important to have a tablespace created before an attempt is made to create tables and indexes in the destination Oracle database.
Regards
John -
I've attempted to identify a primary and foreign key in these two tables, but I am getting a bunch of errors re duplicate keys and column names needing to be unique. Can someone explain to me what I am doing wrong? I have watched numerous tutorials. Perhaps
the primary and foreign key I have identified don't meet the criteria?
CREATE TABLE StockNames
-- Added Primary key to [stock_symbol]
[stock_symbol] VARCHAR(5) NOT NULL CONSTRAINT PK_stock_symbol PRIMARY KEY,
[stock_name] VARCHAR(150) NOT NULL,
[stock_exchange] VARCHAR(50) NOT NULL,
GO
stock_symbol stock_name stock_exchange
AEA American External Accessories NYSE
ASP All Sports Portal NYSE
AIT Anthony Interest Technology NYSE
ATV American Technology Vehicles NYSE
ACM Anderson Charles and Mitchell NYSE
ACH American Career Helpers NYSE
AVA Alleviate America NYSE
and the second table
CREATE TABLE DailyPricesA (
[stock_symbol] VARCHAR (5) NOT NULL CONSTRAINT FK_stocksymbol REFERENCES [StockNames]([stock_symbol]),
[date] VARCHAR (15) NOT NULL,
[stock_price_open] FLOAT (53) NOT NULL,
[stock_price_high] FLOAT (53) NOT NULL,
[stock_price_low] FLOAT (53) NOT NULL,
[stock_price_close] FLOAT (53) NOT NULL,
[stock_volume] INT NOT NULL,
[stock_price_adj_close] FLOAT (53) NOT NULL,
stock_exchange stock_symbol date stock_price_open stock_price_high stock_price_low stock_price_close stock_volume stock_price_adj_close
NYSE AEA 8/02/2010 4.42 4.42 4.21 4.24 205500 4.24
NYSE AEA 5/02/2010 4.42 4.54 4.22 4.41 194300 4.41
NYSE AEA 4/02/2010 4.55 4.69 4.39 4.42 233800 4.42Hi Stan,
I have removed "stock_exchange" - that removed that error. These are the other errors I am experiencing:Msg
2714, Level 16, State 6, Line 8
There is already an object named 'DailyPricesA' in the database.
Msg 2714, Level 16, State 6, Line 36
There is already an object named 'StockNames' in the database.
Msg 2627, Level 14, State 1, Line 47
Violation of PRIMARY KEY constraint 'PK__StockNam__117C59C768B2BB7F'. Cannot insert duplicate key in object 'dbo.StockNames'. The duplicate key value is (AA).
The statement has been terminated.
Msg 1913, Level 16, State 1, Line 54
The operation failed because an index or statistics with name 'SNIndex' already exists on table 'DailyPricesA'.
And the code:
USE NYSEDatabaseProject
-- Drop the table to clean up database.
--DROP TABLE DailyPricesA
--GO
-- Create the table.
CREATE TABLE DailyPricesA (
[stock_symbol] VARCHAR (5) NOT NULL CONSTRAINT FK_stocksymbol REFERENCES [StockNames]([stock_symbol]),
[date] VARCHAR (15) NOT NULL,
[stock_price_open] FLOAT (53) NOT NULL,
[stock_price_high] FLOAT (53) NOT NULL,
[stock_price_low] FLOAT (53) NOT NULL,
[stock_price_close] FLOAT (53) NOT NULL,
[stock_volume] INT NOT NULL,
[stock_price_adj_close] FLOAT (53) NOT NULL,
-- Add a foreign key.
-- [stock_symbol] VARCHAR (5) NOT NULL CONSTRAINT FK_stocksymbol REFERENCES [StockNames]([stock_symbol]),
BULK INSERT DailyPricesA
from 'C:\Users\fenwky\NYSE_daily_prices_A.csv'
-- firstrow = 2 skips the header row, field terminator =',' deterines the separator, and rowterminator defines where the row ends
with (firstrow = 2, fieldterminator = ',', rowterminator = '\n')
GO
-- Create an index named DPAIndex, for the columns stock_symbol//'DPAIndex' already exists on table 'DailyPricesA'
--CREATE INDEX DPAIndex
--ON DailyPricesA (stock_symbol);
-- Drop the table to clean up database.
-- DROP TABLE StockNames
-- GO
CREATE TABLE StockNames
-- Added Primary key to [stock_symbol]
[stock_symbol] VARCHAR(5) NOT NULL CONSTRAINT PK_stock_symbol PRIMARY KEY,
[stock_name] VARCHAR(150) NOT NULL,
[stock_exchange] VARCHAR(50) NOT NULL,
GO
-- Insert the CSV into the table named Stocknames
BULK INSERT StockNames
from 'C:\Users\fenwky\NYSE_stock_names.csv'
-- firstrow = 2 skips the header row, field terminator =',' deterines the separator, and rowterminator defines where the row ends
with (firstrow = 2, fieldterminator = ',', rowterminator = '\n')
GO
-- Create an index named SNIndex, for the columns stock_symbol and stock_exchange.
CREATE INDEX SNIndex
ON DailyPricesA (stock_symbol);
-- Select all from DailyPricesA
select * from StockNames -
Primary key and Foreign key on same column
Hi, I am able to create below tables , primary and foreign keys as below.
But Is this valid design? Can I define a column (ckey2 in table "child") as
primary key and as well as foreign key?
CREATE TABLE parent (
col1 NUMBER,
col2 NUMBER
CREATE TABLE child (
ckey1 NUMBER,
ckey2 NUMBER,
ckey3 NUMBER
alter table parent add constraint parent_pk primary key( col1 );
alter table child add constraint child_pk primary key( ckey2 );
alter table child add constraint child_fk foreign key( ckey2 ) references parent( col1);
Thanks.Can I define a column (ckey2 in table "child") as primary key and as well as foreign key?You mean you want to define a one-to-one relationship between parent and child tables.. why would you want to do that ? You might as well merge the 2 tables into one.
-
Foreign key constraint on multi-column primary key accepts 1 empty column!?
Hi, we have a reference table with a two-column primary key. In the child table there is a non-mandatory foreign key constraint to this table. So if both child columns are null it's ok too. But now we see that if one of the two child table columns that build up the foreign key is null, the other column can have any (non-existant in the master-tabel) value you like!? That does not make sense.
Can anyone explain this to me???
Regards, Paul.Paul, I believe that this is in accordance to the ANSI SQL standard requirement for the treatment of nulls in a multi-column FK. In any case Oracle specifically states this is the way FK work From the 10 Concepts manual, Ch 21 Data Integrity, topic Nulls and Foreign Keys:
The relational model permits the value of foreign keys either to match the referenced primary or unique key value, or be null. If any column of a composite foreign key is null, then the non-null portions of the key do not have to match any corresponding portion of a parent key. <<HTH -- Mark D Powell -- -
how to transfer database table contain null values, primary key, and foreign key to the another database in same server. using INSERT method. thanks
INSERT targetdb.dbo.tbl (col1, col2, col3, ...)
SELECT col1, col2, col3, ...
FROM sourcedb.dbo.tbl
Or what is your question really about? Since you talke about foreign keys etc, I suspect that you want to transfer the entire table definition, but you cannot do that with an INSERT statement.
Erland Sommarskog, SQL Server MVP, [email protected] -
Using FOreign key constraints on tables in database.
I am student and novice in the field of ORACLE and PL/SQL and Database Creation. I had created a database consisting tables and got problem while applying foreign key constraints.
CUST_MSTR
CREATE TABLE "DBA_BANKSYS"."CUST_MSTR"("CUST_NO" VARCHAR2(10),
"FNAME" VARCHAR2(25), "MNAME" VARCHAR2(25), "LNAME" VARCHAR2(25),
"DOB_INC" DATE NOT NULL, "OCCUP" VARCHAR2(25), "PHOTOGRAPH" VARCHAR2(25),
"SIGNATURE" VARCHAR2(25), "PANCOPY" VARCHAR2(1), "FORM60" VARCHAR2(1));
(CUST_NO is PRIMARY KEY, )
-- EMP_MSTR
CREATE TABLE "DBA_BANKSYS"."EMP_MSTR"("EMP_NO" VARCHAR2(10),
"BRANCH_NO" VARCHAR2(10), "FNAME" VARCHAR2(25), "MNAME" VARCHAR2(25),
"LNAME" VARCHAR2(25), "DEPT" VARCHAR2(30), "DESIG" VARCHAR2(30));
(EMP_NO is primary key )
--NOMINEE_MSTR
CREATE TABLE "DBA_BANKSYS"."NOMINEE_MSTR"("NOMINEE_NO" VARCHAR2(10),
"ACCT_FD_NO" VARCHAR2(10), "NAME" VARCHAR2(75), "DOB" DATE,
RELATIONSHIP" VARCHAR2(25));
(NOMINEE_NO is primary key )
--ADDR_DTLS
CREATE TABLE "DBA_BANKSYS"."ADDR_DTLS"("ADDR_NO" NUMBER(6),
"CODE_NO" VARCHAR2(10), "ADDR_TYPE" VARCHAR2(1), "ADDR1" VARCHAR2(50),
"ADDR2" VARCHAR2(50), "CITY" VARCHAR2(25), "STATE" VARCHAR2(25),
"PINCODE" VARCHAR2(6));
( ADDR_NO is primary key )
Problem: I want to apply foreign key constraints on ADDR_DTLS table so that Before inserting value in ADDR_DTLS table it must check, VALUE in ADDR_DTLS.CODE_NO must be PRESENT either in attribute value CUST_MSTR.CODE_NO or EMP_MSTR.CODE_NO or NOMINEE_MSTR.CODE_NO table .
I applied the foreign key constraints using this syntax
CREATE TABLE "DBA_BANKSYS"."ADDR_DTLS"("ADDR_NO" NUMBER(6),
"CODE_NO" VARCHAR2(10), "ADDR_TYPE" VARCHAR2(1), "ADDR1" VARCHAR2(50),
"ADDR2" VARCHAR2(50), "CITY" VARCHAR2(25), "STATE" VARCHAR2(25),
"PINCODE" VARCHAR2(6),
constraints fk_add foreign key CODE_NO references CUST_MSTR. CODE_NO,
constraints fk_add1 foreign key CODE_NO references EMP_MSTR. CODE_NO,
constraints fk_add2 foreign key CODE_NO references NOMINEE_MSTR.CODE_NO);
(foreign key)
ADDR_DTLS.CODE_NO ->CUST_MSTR.CUST_NO
ADDR_DTLS.CODE_NO ->NOMINEE_MSTR.NOMINEE_NO
ADDR_DTLS.CODE_NO ->BRANCH_MSTR.BRANCH_NO
ADDR_DTLS.CODE_NO ->EMP_MSTR.EMP_NO
When I applied foreign key constraints this way, its gives a error called foreign key constraints violation. (I understand that, its searches the attribute value of ADDR_DTLS.CODE_NO in all the three tables must be present then the value will be inserted. But I want, if the value is in any of the three table then its should insert the value or its gives an error.)
Please help me out, though i put the question and i want too know how to apply the forign key in this way. and is there any other option if foreign key implementation is not pssible.If you are on 11g you can use ON DELETE SET NULL:
CREATE TABLE addr_dtls
( addr_no NUMBER(6) CONSTRAINT addr_pk PRIMARY KEY
, addr_cust_no CONSTRAINT addr_cust_fk REFERENCES cust_mstr ON DELETE SET NULL
, addr_emp_no CONSTRAINT addr_emp_fk REFERENCES emp_mstr ON DELETE SET NULL
, addr_nominee_no CONSTRAINT addr_nominee_fk REFERENCES nominee_mstr ON DELETE SET NULL
, addr_type VARCHAR2(1)
, addr1 VARCHAR2(50)
, addr2 VARCHAR2(50)
, city VARCHAR2(25)
, state VARCHAR2(25)
, pincode VARCHAR2(6) );In earlier versions you'll need to code some application logic to do something similar when a parent row is deleted, as otherwise the only options are to delete the dependent rows or raise an error.
btw table names can be up to 30 characters and don't need to end with MSTR or DTLS, so for example CUSTOMERS and ADDRESSES might be more readable than CUST_MSTR and ADDR_DTLS. Also if the Customer/Employee/Nominee PKs are generated from a sequence they should be numeric.
Edited by: William Robertson on Aug 15, 2010 6:47 PM -
Foreign Key Constraint Failure on Self-Referencing Table
In a recent data deletion project, I ran into a problem where Oracle allowed for a record (the parent) to be deleted when there still existed a child record in the same table which referred to the parent.
An abbreviated version of the table is as follows:
create table test (
template_id number not null,
customer_id number null,
parent_id number null,
constraint pk_test primary key (template_id),
constraint r_parent foreign key (parent_id) references test (template_id));
The parent and child records are as follows:
Parent: template_id = 100, customer_id = 200, parent_id = null
Child: template_id = 101, customer_id = null, parent_id = 100
Records were deleted from this table using:
DELETE FROM test WHERE customer_id = 200;
When this statement is executed, is it being executed as part of 155 delete statements using PL/SQL, and tens of thousands of records from 155 tables are being deleted. These delete statements have been ordered taking into account foreign key constraints. All 155 statements are being deleted in a single transaction. The delete statement above was the 23rd statement of the set to be executed. I would have expected when this delete statement was executed, an error would have been thrown. However, all 155 delete statements successfully complete, and after committing the results, the child record above still exists in the DB as an orphan. I also tried executing the first 23 statements manually in SQL*Plus (still one transaction), and the problem still occurs: the parent is deleted and the child is orphaned.
If I execute the very simple example above, I do indeed get an referential constraint error.
Has anyone ever encountered this situation? And does anyone have any ideas how to go about troubleshooting this problem. We need to know the cause of this, as we have a small handful of table with a similar self-referential foreign key constraint set-up.
Thank you very much in advance,
MarkFirst of all, the very simple example that I outlined above I have already tried and it worked: when I attempted to delete the parent a referential integrity error was thrown as one would expect. This small example was my test case to see if I could reproduce what I'm seeing in our application in a more manageable and demonstrable example. But as it worked, I'm still perplexed in reconciling the differences between what I'm seeing in our application (which I can't demonstrate in this help group) and the test case. When I used the test case in my first posting in this thread, I used it to help describe the problem I'm encountered, even though that small example works.
Below is more of the table you've asked for.
OWNER CONSTRAINT_NAME CONSTRAINT_TYPE TABLE_NAME SEARCH_CONDITION R_OWNER R_CONSTRAINT_NAME DELETE_RULE STATUS DEFERRABLE DEFERRED VALIDATED GENERATED BAD RELY LAST_CHANGE INDEX_OWNER INDEX_NAME INVALID VIEW_RELATED
"DOCPADMIN" "R_TEMPLATE_PARENT" "R" "DCR_TEMPLATE" (null) "DOCPADMIN" "XPKDCR_TEMPLATE" "NO ACTION" "ENABLED" "NOT DEFERRABLE" "IMMEDIATE" "VALIDATED" "USER NAME" (null) (null) "2010-01-13 19:01:21" (null) (null) (null) (null)
"DOCPADMIN" "XPKDCR_TEMPLATE" "P" "DCR_TEMPLATE" (null) (null) (null) (null) "ENABLED" "NOT DEFERRABLE" "IMMEDIATE" "VALIDATED" "USER NAME" (null) (null) "2010-01-13 15:48:31" (null) "XPKDCR_TEMPLATE" (null) (null)Overall, I haven't said that Oracle's FK mechanism is broken. What I've said is that I've got a situation that I'm trying to understand. My first attempt at my test case didn't work because the test case worked as it should. I'm trying to figure out another course of action to try and figure this situation out. -
Wrong order foreign key constraints
Hi,
i have problems with non-deferred foreing key constraints:
I have a table "PERSON" and a table "ADRESSE" which has a foreign key
to "PERSON". Both tables have primary keys with two columns.
In the mappings I use application identity. The mappings are generated by
xdoclet.
We cannot use deferred constraint because we have to support following
databases: Oracle, Firebird, MS SQL, DB2.
I tested the mappings with Oracle and Firebird and got this exception
(with SQL Trace):
5602 TRACE [main] kodo.jdbc.SQL - <t 26577913, conn 33108879 (1 errors)>
[15 ms] executing prepstmnt 22511833 INSERT INTO VAMP.ADRESSE (ADRESSART,
EMAIL, FAXNR, ID, MANDANTID, MELDEADRESSE, MOBILNR, ORT, PERSONID, PLZ,
POSTADRESSE, POSTFACH, STRASSE, TELEFONNR) VALUES (?, ?, ?, ?, ?, ?, ?, ?,
?, ?, ?, ?, ?, ?) [params=(int) 1, (String) [email protected], (String)
04941 183742, (int) 12761, (int) 1, (int) 1, (String) 0171 2846751,
(String) Oldenburg, (int) 12760, (String) 26129, (int) 1, (null) null,
(String) Ammerl__nder Heerstra__e 19, (String) 04941 183740] [reused=0]
5602 TRACE [main] kodo.jdbc.SQL - <t 26577913, conn 33108879 (2 errors)>
[0 ms] executing prepstmnt 22511833 INSERT INTO VAMP.ADRESSE (ADRESSART,
EMAIL, FAXNR, ID, MANDANTID, MELDEADRESSE, MOBILNR, ORT, PERSONID, PLZ,
POSTADRESSE, POSTFACH, STRASSE, TELEFONNR) VALUES (?, ?, ?, ?, ?, ?, ?, ?,
?, ?, ?, ?, ?, ?) [params=(int) 3, (null) null, (null) null, (int) 12764,
(int) 1, (int) 0, (null) null, (String) Sylt, (int) 12759, (String) 25980,
(int) 0, (null) null, (String) Stephanstra__e 47, (String) 04651 19283]
[reused=1]
5618 TRACE [main] kodo.jdbc.SQL - <t 26577913, conn 33108879 (2 errors)>
[0 ms] executing prepstmnt 13390902 INSERT INTO VAMP.PERSON (ANREDEID, ID,
KUNDENNR, LOESCHBEMERKUNG, MANDANTID, NAME1, NAME2, PERSONENDATUM,
PERSONENORT, TYP) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) [params=(null)
null, (int) 12759, (String) 9999452800, (null) null, (int) 1, (String)
Horstmann, (String) Manfred, (Timestamp) 1959-03-10 00:00:00.381, (String)
Flensburg, (int) 1] [reused=0]
5618 TRACE [main] kodo.jdbc.SQL - <t 26577913, conn 33108879 (2 errors)>
[0 ms] executing prepstmnt 22511833 INSERT INTO VAMP.ADRESSE (ADRESSART,
EMAIL, FAXNR, ID, MANDANTID, MELDEADRESSE, MOBILNR, ORT, PERSONID, PLZ,
POSTADRESSE, POSTFACH, STRASSE, TELEFONNR) VALUES (?, ?, ?, ?, ?, ?, ?, ?,
?, ?, ?, ?, ?, ?) [params=(int) 1, (String) [email protected], (String)
04941 183742, (int) 12763, (int) 1, (int) 1, (String) 0171 2846751,
(String) Oldenburg, (int) 12759, (String) 26129, (int) 1, (null) null,
(String) Ammerl__nder Heerstra__e 19, (String) 04941 183740] [reused=2]
5618 TRACE [main] kodo.jdbc.SQL - <t 26577913, conn 33108879 (3 errors)>
[0 ms] executing prepstmnt 22511833 INSERT INTO VAMP.ADRESSE (ADRESSART,
EMAIL, FAXNR, ID, MANDANTID, MELDEADRESSE, MOBILNR, ORT, PERSONID, PLZ,
POSTADRESSE, POSTFACH, STRASSE, TELEFONNR) VALUES (?, ?, ?, ?, ?, ?, ?, ?,
?, ?, ?, ?, ?, ?) [params=(int) 3, (null) null, (null) null, (int) 12762,
(int) 1, (int) 0, (null) null, (String) Sylt, (int) 12760, (String) 25980,
(int) 0, (null) null, (String) Stephanstra__e 47, (String) 04651 19283]
[reused=3]
5618 TRACE [main] kodo.jdbc.SQL - <t 26577913, conn 33108879 (3 errors)>
[0 ms] executing prepstmnt 13390902 INSERT INTO VAMP.PERSON (ANREDEID, ID,
KUNDENNR, LOESCHBEMERKUNG, MANDANTID, NAME1, NAME2, PERSONENDATUM,
PERSONENORT, TYP) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) [params=(null)
null, (int) 12760, (String) 9999452801, (null) null, (int) 1, (String)
Horstmann, (String) Christine, (Timestamp) 1972-03-10 00:00:00.381,
(String) Erfurt, (int) 1] [reused=1]
5618 TRACE [main] kodo.jdbc.SQL - <t 26577913, conn 33108879 (3 errors)>
[0 ms] executing prepstmnt 11320634 INSERT INTO VAMP.NATPERSON
(ANZAHLKINDER, ARBEITGEBERID, BEITRAGSSATZ, BERUFID, BRANCHEID,
FAMILIENSTAND, FAMSTANDSEIT, FINANZAMTID, GEBIETSFREMDERAWG, GUETERSTAND,
IDBEHOERDE, IDNR, KIRCHENSTEUER, KVID, MANDANTID, PERSONID, PRIVATKV,
STAAT, STEUERBERATERID, STEUERKLASSE, STEUERNR, STEUERTARIF, TITEL) VALUES
[params=(int) 0, (null) null, (double) 0.0, (null) null, (int) 12410,
(int) 2, (Timestamp) 1991-12-12 00:00:00.381, (null) null, (int) 0, (int)
3, (null) null, (null) null, (int) 0, (int) 12576, (int) 1, (int) 12760,
(int) 0, (null) null, (null) null, (int) 0, (null) null, (int) 1, (null)
null] [reused=0]
5618 TRACE [main] kodo.jdbc.SQL - <t 26577913, conn 33108879 (3 errors)>
[0 ms] executing prepstmnt 11320634 INSERT INTO VAMP.NATPERSON
(ANZAHLKINDER, ARBEITGEBERID, BEITRAGSSATZ, BERUFID, BRANCHEID,
FAMILIENSTAND, FAMSTANDSEIT, FINANZAMTID, GEBIETSFREMDERAWG, GUETERSTAND,
IDBEHOERDE, IDNR, KIRCHENSTEUER, KVID, MANDANTID, PERSONID, PRIVATKV,
STAAT, STEUERBERATERID, STEUERKLASSE, STEUERNR, STEUERTARIF, TITEL) VALUES
[params=(int) 0, (null) null, (double) 0.0, (int) 12362, (int) 12378,
(int) 2, (Timestamp) 1991-12-12 00:00:00.381, (null) null, (int) 0, (int)
3, (null) null, (null) null, (int) 0, (int) 12576, (int) 1, (int) 12759,
(int) 0, (null) null, (null) null, (int) 0, (null) null, (int) 1, (null)
null] [reused=1]
5634 TRACE [main] kodo.jdbc.JDBC - <t 26577913, conn 33108879 (3
errors)> [16 ms] rollback
5634 TRACE [main] kodo.jdbc.JDBC - <t 26577913, conn 33108879 (3
errors)> return
5634 TRACE [main] kodo.jdbc.JDBC - <t 26577913, conn 33108879 (3
errors)> [0 ms] close
com.solarmetric.jdbc.ReportingSQLException: ORA-02291: integrity
constraint (VAMP.ADRESSE_PS) violated - parent key not found
{prepstmnt 22511833 INSERT INTO VAMP.ADRESSE (ADRESSART, EMAIL, FAXNR,
ID, MANDANTID, MELDEADRESSE, MOBILNR, ORT, PERSONID, PLZ, POSTADRESSE,
POSTFACH, STRASSE, TELEFONNR) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
?, ?) [params=(int) 1, (String) [email protected], (String) 04941
183742, (int) 12761, (int) 1, (int) 1, (String) 0171 2846751, (String)
Oldenburg, (int) 12760, (String) 26129, (int) 1, (null) null, (String)
Ammerl__nder Heerstra__e 19, (String) 04941 183740] [reused=0]} [code=2291,
state=23000]
at
com.solarmetric.jdbc.LoggingConnectionDecorator.wrap(LoggingConnectionDecorator.java:124)
at
com.solarmetric.jdbc.LoggingConnectionDecorator.access$600(LoggingConnectionDecorator.java:19)
at
com.solarmetric.jdbc.LoggingConnectionDecorator$LoggingConnection$LoggingPreparedStatement.executeUpdate(LoggingConnectionDecorator.java:728)
at
com.solarmetric.jdbc.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:362)
How can I force it to insert in the table "NATPERSON" first and then in
the table "ADRESSE"?
I use following JDBC-drivers:
Firebird: 1.5.5
Oracle: 9.2.0.1.0
My property file:
<!-- standard properties for all dbms -->
<prop key="kodo.LicenseKey">LICENSE KEY REMOVED</prop>
<prop key="kodo.ConnectionFactoryProperties">MaxCachedStatements=150,
MaxActive=50, MaxIdle=50</prop>
<prop key="kodo.FetchBatchSize">200</prop>
<prop key="kodo.DataCache">true(CacheSize=5000)</prop>
<prop key="kodo.RemoteCommitProvider">sjvm</prop>
<prop key="kodo.jdbc.MappingFactory">metadata</prop>
<prop key="kodo.jdbc.ForeignKeyConstraints">true</prop>
<prop key="kodo.jdbc.SchemaFactory">native</prop>
<prop
key="javax.jdo.PersistenceManagerFactoryClass">kodo.jdbc.runtime.JDBCPersistenceManagerFactory</prop>
<prop key="javax.jdo.option.Optimistic">true</prop>
<!-- oracle connection properties -->
<prop key="kodo.jdbc.DBDictionary">oracle</prop>
<prop
key="javax.jdo.option.ConnectionDriverName">oracle.jdbc.driver.OracleDriver</prop>
<prop key="javax.jdo.option.ConnectionURL">..</prop>
<prop key="javax.jdo.option.ConnectionUserName">..</prop>
<prop key="javax.jdo.option.ConnectionPassword">..</prop>
<prop key="kodo.jdbc.SequenceFactory">native</prop>
<prop key="kodo.jdbc.Schemas">..</prop>
<!-- firebird connection properties
<prop key="kodo.jdbc.DBDictionary">kodo.jdbc.sql.FirebirdDictionary</prop>
<prop
key="javax.jdo.option.ConnectionDriverName">org.firebirdsql.jdbc.FBDriver</prop>
<prop key="javax.jdo.option.ConnectionURL">..</prop>
<prop key="javax.jdo.option.ConnectionUserName">..</prop>
<prop key="javax.jdo.option.ConnectionPassword">..</prop>
<prop key="kodo.jdbc.SequenceFactory">native(TableName=SYSDUAL,
Format="SELECT GEN_ID({0},1) FROM {1}")</prop>
-->
My database schema looks like this:
TABLE PERSON
FIELD MANDANTID (SMALLINT REQUIRED COMMENT (""))
FIELD ID (AUTOINC COMMENT (""))
FIELD TYP (SMALLINT REQUIRED COMMENT (""))
FIELD KUNDENNR (CHAR(15) COMMENT ("Kundennummer"))
PRIMARY KEY
FIELD MANDANTID
FIELD ID
FOREIGN KEY MD
TABLE MANDANT
FIELD MANDANTID
INDEX KDNR
FIELD MANDANTID
FIELD KUNDENNR
UNIQUE
TABLE ADRESSE
FIELD MANDANTID (SMALLINT REQUIRED COMMENT (""))
FIELD ID (AUTOINC COMMENT (""))
FIELD PERSONID (LONGINT REQUIRED COMMENT (""))
PRIMARY KEY
FIELD MANDANTID
FIELD ID
FOREIGN KEY PS
TABLE PERSON
FIELD MANDANTID
FIELD PERSONID
My metadata looks like this:
<class name="PersonDO"
identity-type="application"
objectid-class="com.elaxy.vamp.dom.person.PersonDOId"
persistence-capable-superclass="com.elaxy.vamp.dom.AbstractDO">
<extension vendor-name="kodo"
key="jdbc-class-ind"
value="metadata-value">
</extension>
<extension vendor-name="kodo"
key="jdbc-class-ind/column"
value="TYP">
</extension>
<extension vendor-name="kodo"
key="jdbc-class-ind-value"
value="-1">
</extension>
<extension vendor-name="kodo"
key="jdbc-class-map"
value="base">
</extension>
<extension vendor-name="kodo"
key="jdbc-class-map/table"
value="PERSON">
</extension>
<extension vendor-name="kodo"
key="jdbc-field-mappings"
value="">
</extension>
<extension vendor-name="kodo"
key="jdbc-field-mappings/AbstractDO.id"
value="">
</extension>
<extension vendor-name="kodo"
key="jdbc-field-mappings/AbstractDO.id/jdbc-field-map"
value="value">
</extension>
<extension vendor-name="kodo"
key="jdbc-field-mappings/AbstractDO.id/jdbc-field-map/column"
value="ID">
</extension>
<extension vendor-name="kodo"
key="jdbc-field-mappings"
value="">
</extension>
<extension vendor-name="kodo"
key="jdbc-field-mappings/AbstractDO.mandantId"
value="">
</extension>
<extension vendor-name="kodo"
key="jdbc-field-mappings/AbstractDO.mandantId/jdbc-field-map"
value="value">
</extension>
<extension vendor-name="kodo"
key="jdbc-field-mappings/AbstractDO.mandantId/jdbc-field-map/column"
value="MANDANTID">
</extension>
<field name="kundenNr"
persistence-modifier="persistent">
</field>
<field name="adressen"
persistence-modifier="persistent">
<collection
element-type="com.elaxy.vamp.dom.person.AdresseDO">
</collection>
<extension vendor-name="kodo"
key="jdbc-field-map"
value="one-many">
</extension>
<extension vendor-name="kodo"
key="jdbc-field-map/ref-column.MANDANTID"
value="MANDANTID">
</extension>
<extension vendor-name="kodo"
key="jdbc-field-map/ref-column.ID"
value="PERSONID">
</extension>
<extension vendor-name="kodo"
key="jdbc-field-map/table"
value="ADRESSE">
</extension>
</field>
.. fields ..
</class>
<class name="AdresseDO"
identity-type="application"
objectid-class="com.elaxy.vamp.dom.person.AdresseDOId"
persistence-capable-superclass="com.elaxy.vamp.dom.AbstractDO">
<extension vendor-name="kodo"
key="jdbc-class-map"
value="base">
</extension>
<extension vendor-name="kodo"
key="jdbc-class-map/table"
value="ADRESSE">
</extension>
<extension vendor-name="kodo"
key="jdbc-sequence-name"
value="ADRESSE_SEQ">
</extension>
<extension vendor-name="kodo"
key="jdbc-field-mappings"
value="">
</extension>
<extension vendor-name="kodo"
key="jdbc-field-mappings/AbstractDO.id"
value="">
</extension>
<extension vendor-name="kodo"
key="jdbc-field-mappings/AbstractDO.id/jdbc-field-map"
value="value">
</extension>
<extension vendor-name="kodo"
key="jdbc-field-mappings/AbstractDO.id/jdbc-field-map/column"
value="ID">
</extension>
<extension vendor-name="kodo"
key="jdbc-field-mappings"
value="">
</extension>
<extension vendor-name="kodo"
key="jdbc-field-mappings/AbstractDO.mandantId"
value="">
</extension>
<extension vendor-name="kodo"
key="jdbc-field-mappings/AbstractDO.mandantId/jdbc-field-map"
value="value">
</extension>
<extension vendor-name="kodo"
key="jdbc-field-mappings/AbstractDO.mandantId/jdbc-field-map/column"
value="MANDANTID">
</extension>
.. fields ..
</class>
Many thanks,
JanMarc
This is a part of the output from the "schemagen" tool:
<schemas>
<schema name="VAMP">
<table name="ADRESSE">
<pk name="ADRESSE_PRIMARY">
<on column="ID"/>
<on column="MANDANTID"/>
</pk>
<column name="ADRESSART" type="decimal" type-name="NUMBER"
size="5"/>
<column name="EMAIL" type="varchar" type-name="VARCHAR2"
size="30"/>
<column name="FAXNR" type="varchar" type-name="VARCHAR2"
size="25"/>
<column name="ID" type="decimal" type-name="NUMBER"
not-null="true" size="10"/>
<column name="LAND" type="decimal" type-name="NUMBER"
size="10"/>
<column name="MANDANTID" type="decimal" type-name="NUMBER"
not-null="true" size="5"/>
<column name="MELDEADRESSE" type="decimal" type-name="NUMBER"
size="1"/>
<column name="MOBILNR" type="varchar" type-name="VARCHAR2"
size="25"/>
<column name="ORT" type="varchar" type-name="VARCHAR2"
size="30"/>
<column name="PERSONID" type="decimal" type-name="NUMBER"
not-null="true" size="10"/>
<column name="PLZ" type="varchar" type-name="VARCHAR2"
size="5"/>
<column name="POSTADRESSE" type="decimal" type-name="NUMBER"
size="1"/>
<column name="POSTFACH" type="varchar" type-name="VARCHAR2"
size="10"/>
<column name="STRASSE" type="varchar" type-name="VARCHAR2"
size="30"/>
<column name="TELEFONNR" type="varchar" type-name="VARCHAR2"
size="25"/>
<fk name="ADRESSE_PS" delete-action="cascade"
to-table="VAMP.PERSON">
<join column="MANDANTID" to-column="MANDANTID"/>
<join column="PERSONID" to-column="ID"/>
</fk>
<index name="ADRESSE_ORT">
<on column="MANDANTID"/>
<on column="ORT"/>
</index>
<index name="ADRESSE_PLZ">
<on column="MANDANTID"/>
<on column="PLZ"/>
</index>
<index name="ADRESSE_PS">
<on column="MANDANTID"/>
<on column="PERSONID"/>
</index>
<index name="ADRESSE_STR">
<on column="MANDANTID"/>
<on column="STRASSE"/>
</index>
</table>
The foreign key "ADRESSE_PS" was identified correctly.
I've taken a look at the class OracleDictionary and it seems that the
object "ForeignKey" considers only one column from the foreign keys -
but I use foreign keys that include two columns ("MANDANTID", "PERSONID").
Is that right or are foreign keys with two columns allowed by the
OracleDictionary?
Marc Prud'hommeaux wrote:
Jan-
That is odd ... Kodo should be identifying the foreign keys and ordering
the statements accordingly. The mappings appear correct to me at first
glance. If you run the "schemagen" tool, does Kodo correctly identify
the foreign key constraints in the database? Can you post the output
from the command so we can take a look?
Jan-Esdert Franken wrote:
Hi,
i have problems with non-deferred foreing key constraints:
I have a table "PERSON" and a table "ADRESSE" which has a foreign key
to "PERSON". Both tables have primary keys with two columns.
In the mappings I use application identity. The mappings are generated by
xdoclet.
We cannot use deferred constraint because we have to support following
databases: Oracle, Firebird, MS SQL, DB2.
I tested the mappings with Oracle and Firebird and got this exception
(with SQL Trace):
5602 TRACE [main] kodo.jdbc.SQL - <t 26577913, conn 33108879 (1 errors)>
[15 ms] executing prepstmnt 22511833 INSERT INTO VAMP.ADRESSE (ADRESSART,
EMAIL, FAXNR, ID, MANDANTID, MELDEADRESSE, MOBILNR, ORT, PERSONID, PLZ,
POSTADRESSE, POSTFACH, STRASSE, TELEFONNR) VALUES (?, ?, ?, ?, ?, ?, ?, ?,
?, ?, ?, ?, ?, ?) [params=(int) 1, (String) [email protected], (String)
04941 183742, (int) 12761, (int) 1, (int) 1, (String) 0171 2846751,
(String) Oldenburg, (int) 12760, (String) 26129, (int) 1, (null) null,
(String) Ammerl__nder Heerstra__e 19, (String) 04941 183740] [reused=0]
5602 TRACE [main] kodo.jdbc.SQL - <t 26577913, conn 33108879 (2 errors)>
[0 ms] executing prepstmnt 22511833 INSERT INTO VAMP.ADRESSE (ADRESSART,
EMAIL, FAXNR, ID, MANDANTID, MELDEADRESSE, MOBILNR, ORT, PERSONID, PLZ,
POSTADRESSE, POSTFACH, STRASSE, TELEFONNR) VALUES (?, ?, ?, ?, ?, ?, ?, ?,
?, ?, ?, ?, ?, ?) [params=(int) 3, (null) null, (null) null, (int) 12764,
(int) 1, (int) 0, (null) null, (String) Sylt, (int) 12759, (String) 25980,
(int) 0, (null) null, (String) Stephanstra__e 47, (String) 04651 19283]
[reused=1]
5618 TRACE [main] kodo.jdbc.SQL - <t 26577913, conn 33108879 (2 errors)>
[0 ms] executing prepstmnt 13390902 INSERT INTO VAMP.PERSON (ANREDEID, ID,
KUNDENNR, LOESCHBEMERKUNG, MANDANTID, NAME1, NAME2, PERSONENDATUM,
PERSONENORT, TYP) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) [params=(null)
null, (int) 12759, (String) 9999452800, (null) null, (int) 1, (String)
Horstmann, (String) Manfred, (Timestamp) 1959-03-10 00:00:00.381, (String)
Flensburg, (int) 1] [reused=0]
5618 TRACE [main] kodo.jdbc.SQL - <t 26577913, conn 33108879 (2 errors)>
[0 ms] executing prepstmnt 22511833 INSERT INTO VAMP.ADRESSE (ADRESSART,
EMAIL, FAXNR, ID, MANDANTID, MELDEADRESSE, MOBILNR, ORT, PERSONID, PLZ,
POSTADRESSE, POSTFACH, STRASSE, TELEFONNR) VALUES (?, ?, ?, ?, ?, ?, ?, ?,
?, ?, ?, ?, ?, ?) [params=(int) 1, (String) [email protected], (String)
04941 183742, (int) 12763, (int) 1, (int) 1, (String) 0171 2846751,
(String) Oldenburg, (int) 12759, (String) 26129, (int) 1, (null) null,
(String) Ammerl__nder Heerstra__e 19, (String) 04941 183740] [reused=2]
5618 TRACE [main] kodo.jdbc.SQL - <t 26577913, conn 33108879 (3 errors)>
[0 ms] executing prepstmnt 22511833 INSERT INTO VAMP.ADRESSE (ADRESSART,
EMAIL, FAXNR, ID, MANDANTID, MELDEADRESSE, MOBILNR, ORT, PERSONID, PLZ,
POSTADRESSE, POSTFACH, STRASSE, TELEFONNR) VALUES (?, ?, ?, ?, ?, ?, ?, ?,
?, ?, ?, ?, ?, ?) [params=(int) 3, (null) null, (null) null, (int) 12762,
(int) 1, (int) 0, (null) null, (String) Sylt, (int) 12760, (String) 25980,
(int) 0, (null) null, (String) Stephanstra__e 47, (String) 04651 19283]
[reused=3]
5618 TRACE [main] kodo.jdbc.SQL - <t 26577913, conn 33108879 (3 errors)>
[0 ms] executing prepstmnt 13390902 INSERT INTO VAMP.PERSON (ANREDEID, ID,
KUNDENNR, LOESCHBEMERKUNG, MANDANTID, NAME1, NAME2, PERSONENDATUM,
PERSONENORT, TYP) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) [params=(null)
null, (int) 12760, (String) 9999452801, (null) null, (int) 1, (String)
Horstmann, (String) Christine, (Timestamp) 1972-03-10 00:00:00.381,
(String) Erfurt, (int) 1] [reused=1]
5618 TRACE [main] kodo.jdbc.SQL - <t 26577913, conn 33108879 (3 errors)>
[0 ms] executing prepstmnt 11320634 INSERT INTO VAMP.NATPERSON
(ANZAHLKINDER, ARBEITGEBERID, BEITRAGSSATZ, BERUFID, BRANCHEID,
FAMILIENSTAND, FAMSTANDSEIT, FINANZAMTID, GEBIETSFREMDERAWG, GUETERSTAND,
IDBEHOERDE, IDNR, KIRCHENSTEUER, KVID, MANDANTID, PERSONID, PRIVATKV,
STAAT, STEUERBERATERID, STEUERKLASSE, STEUERNR, STEUERTARIF, TITEL) VALUES
[params=(int) 0, (null) null, (double) 0.0, (null) null, (int) 12410,
(int) 2, (Timestamp) 1991-12-12 00:00:00.381, (null) null, (int) 0, (int)
3, (null) null, (null) null, (int) 0, (int) 12576, (int) 1, (int) 12760,
(int) 0, (null) null, (null) null, (int) 0, (null) null, (int) 1, (null)
null] [reused=0]
5618 TRACE [main] kodo.jdbc.SQL - <t 26577913, conn 33108879 (3 errors)>
[0 ms] executing prepstmnt 11320634 INSERT INTO VAMP.NATPERSON
(ANZAHLKINDER, ARBEITGEBERID, BEITRAGSSATZ, BERUFID, BRANCHEID,
FAMILIENSTAND, FAMSTANDSEIT, FINANZAMTID, GEBIETSFREMDERAWG, GUETERSTAND,
IDBEHOERDE, IDNR, KIRCHENSTEUER, KVID, MANDANTID, PERSONID, PRIVATKV,
STAAT, STEUERBERATERID, STEUERKLASSE, STEUERNR, STEUERTARIF, TITEL) VALUES
[params=(int) 0, (null) null, (double) 0.0, (int) 12362, (int) 12378,
(int) 2, (Timestamp) 1991-12-12 00:00:00.381, (null) null, (int) 0, (int)
3, (null) null, (null) null, (int) 0, (int) 12576, (int) 1, (int) 12759,
(int) 0, (null) null, (null) null, (int) 0, (null) null, (int) 1, (null)
null] [reused=1]
5634 TRACE [main] kodo.jdbc.JDBC - <t 26577913, conn 33108879 (3
errors)> [16 ms] rollback
5634 TRACE [main] kodo.jdbc.JDBC - <t 26577913, conn 33108879 (3
errors)> return
5634 TRACE [main] kodo.jdbc.JDBC - <t 26577913, conn 33108879 (3
errors)> [0 ms] close
com.solarmetric.jdbc.ReportingSQLException: ORA-02291: integrity
constraint (VAMP.ADRESSE_PS) violated - parent key not found
{prepstmnt 22511833 INSERT INTO VAMP.ADRESSE (ADRESSART, EMAIL, FAXNR,
ID, MANDANTID, MELDEADRESSE, MOBILNR, ORT, PERSONID, PLZ, POSTADRESSE,
POSTFACH, STRASSE, TELEFONNR) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
?, ?) [params=(int) 1, (String) [email protected], (String) 04941
183742, (int) 12761, (int) 1, (int) 1, (String) 0171 2846751, (String)
Oldenburg, (int) 12760, (String) 26129, (int) 1, (null) null, (String)
Ammerl__nder Heerstra__e 19, (String) 04941 183740] [reused=0]} [code=2291,
state=23000]
at
com.solarmetric.jdbc.LoggingConnectionDecorator.wrap(LoggingConnectionDecorator.java:124)
at
com.solarmetric.jdbc.LoggingConnectionDecorator.access$600(LoggingConnectionDecorator.java:19)
at
com.solarmetric.jdbc.LoggingConnectionDecorator$LoggingConnection$LoggingPreparedStatement.executeUpdate(LoggingConnectionDecorator.java:728)
at
com.solarmetric.jdbc.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:362)
How can I force it to insert in the table "NATPERSON" first and then in
the table "ADRESSE"?
I use following JDBC-drivers:
Firebird: 1.5.5
Oracle: 9.2.0.1.0
My property file:
<!-- standard properties for all dbms -->
<prop key="kodo.LicenseKey">LICENSE KEY REMOVED</prop>
<prop key="kodo.ConnectionFactoryProperties">MaxCachedStatements=150,
MaxActive=50, MaxIdle=50</prop>
<prop key="kodo.FetchBatchSize">200</prop>
<prop key="kodo.DataCache">true(CacheSize=5000)</prop>
<prop key="kodo.RemoteCommitProvider">sjvm</prop>
<prop key="kodo.jdbc.MappingFactory">metadata</prop>
<prop key="kodo.jdbc.ForeignKeyConstraints">true</prop>
<prop key="kodo.jdbc.SchemaFactory">native</prop>
<prop
key="javax.jdo.PersistenceManagerFactoryClass">kodo.jdbc.runtime.JDBCPersistenceManagerFactory</prop>
<prop key="javax.jdo.option.Optimistic">true</prop>
<!-- oracle connection properties -->
<prop key="kodo.jdbc.DBDictionary">oracle</prop>
<prop
key="javax.jdo.option.ConnectionDriverName">oracle.jdbc.driver.OracleDriver</prop>
<prop key="javax.jdo.option.ConnectionURL">..</prop>
<prop key="javax.jdo.option.ConnectionUserName">..</prop>
<prop key="javax.jdo.option.ConnectionPassword">..</prop>
<prop key="kodo.jdbc.SequenceFactory">native</prop>
<prop key="kodo.jdbc.Schemas">..</prop>
<!-- firebird connection properties
<prop key="kodo.jdbc.DBDictionary">kodo.jdbc.sql.FirebirdDictionary</prop>
<prop
key="javax.jdo.option.ConnectionDriverName">org.firebirdsql.jdbc.FBDriver</prop>
<prop key="javax.jdo.option.ConnectionURL">..</prop>
<prop key="javax.jdo.option.ConnectionUserName">..</prop>
<prop key="javax.jdo.option.ConnectionPassword">..</prop>
<prop key="kodo.jdbc.SequenceFactory">native(TableName=SYSDUAL,
Format="SELECT GEN_ID(,1) FROM ")</prop>
-->
My database schema looks like this:
TABLE PERSON
FIELD MANDANTID (SMALLINT REQUIRED COMMENT (""))
FIELD ID (AUTOINC COMMENT (""))
FIELD TYP (SMALLINT REQUIRED COMMENT (""))
FIELD KUNDENNR (CHAR(15) COMMENT ("Kundennummer"))
PRIMARY KEY
FIELD MANDANTID
FIELD ID
FOREIGN KEY MD
TABLE MANDANT
FIELD MANDANTID
INDEX KDNR
FIELD MANDANTID
FIELD KUNDENNR
UNIQUE
TABLE ADRESSE
FIELD MANDANTID (SMALLINT REQUIRED COMMENT (""))
FIELD ID (AUTOINC COMMENT (""))
FIELD PERSONID (LONGINT REQUIRED COMMENT (""))
PRIMARY KEY
FIELD MANDANTID
FIELD ID
FOREIGN KEY PS
TABLE PERSON
FIELD MANDANTID
FIELD PERSONID
My metadata looks like this:
<class name="PersonDO"
identity-type="application"
objectid-class="com.elaxy.vamp.dom.person.PersonDOId"
persistence-capable-superclass="com.elaxy.vamp.dom.AbstractDO">
<extension vendor-name="kodo"
key="jdbc-class-ind"
value="metadata-value">
</extension>
<extension vendor-name="kodo"
key="jdbc-class-ind/column"
value="TYP">
</extension>
<extension vendor-name="kodo"
key="jdbc-class-ind-value"
value="-1">
</extension>
<extension vendor-name="kodo"
key="jdbc-class-map"
value="base">
</extension>
<extension vendor-name="kodo"
key="jdbc-class-map/table"
value="PERSON">
</extension>
<extension vendor-name="kodo"
key="jdbc-field-mappings"
value="">
</extension>
<extension vendor-name="kodo"
key="jdbc-field-mappings/AbstractDO.id"
value="">
</extension>
<extension vendor-name="kodo"
key="jdbc-field-mappings/AbstractDO.id/jdbc-field-map"
value="value">
</extension>
<extension vendor-name="kodo"
key="jdbc-field-mappings/AbstractDO.id/jdbc-field-map/column"
value="ID">
</extension>
<extension vendor-name="kodo"
key="jdbc-field-mappings"
value="">
</extension>
<extension vendor-name="kodo"
key="jdbc-field-mappings/AbstractDO.mandantId"
value="">
</extension>
<extension vendor-name="kodo"
key="jdbc-field-mappings/AbstractDO.mandantId/jdbc-field-map"
value="value">
</extension>
<extension vendor-name="kodo"
key="jdbc-field-mappings/AbstractDO.mandantId/jdbc-field-map/column"
value="MANDANTID">
</extension>
<field name="kundenNr"
persistence-modifier="persistent">
</field>
<field name="adressen"
persistence-modifier="persistent">
<collection
element-type="com.elaxy.vamp.dom.person.AdresseDO">
</collection>
<extension vendor-name="kodo"
key="jdbc-field-map"
value="one-many">
</extension>
<extension vendor-name="kodo"
key="jdbc-field-map/ref-column.MANDANTID"
value="MANDANTID">
</extension>
<extension vendor-name="kodo"
key="jdbc-field-map/ref-column.ID"
value="PERSONID">
</extension>
<extension vendor-name="kodo"
key="jdbc-field-map/table"
value="ADRESSE">
</extension>
</field>
.. fields ..
</class>
<class name="AdresseDO"
identity-type="application"
objectid-class="com.elaxy.vamp.dom.person.AdresseDOId"
persistence-capable-superclass="com.elaxy.vamp.dom.AbstractDO">
<extension vendor-name="kodo"
key="jdbc-class-map"
value="base">
</extension>
<extension vendor-name="kodo"
key="jdbc-class-map/table"
value="ADRESSE">
</extension>
<extension vendor-name="kodo"
key="jdbc-sequence-name"
value="ADRESSE_SEQ">
</extension>
<extension vendor-name="kodo"
key="jdbc-field-mappings"
value="">
</extension>
<extension vendor-name="kodo"
key="jdbc-field-mappings/AbstractDO.id"
value="">
</extension>
<extension vendor-name="kodo"
key="jdbc-field-mappings/AbstractDO.id/jdbc-field-map"
value="value">
</extension>
<extension vendor-name="kodo"
key="jdbc-field-mappings/AbstractDO.id/jdbc-field-map/column"
value="ID">
</extension>
<extension vendor-name="kodo"
key="jdbc-field-mappings"
value="">
</extension>
<extension vendor-name="kodo"
key="jdbc-field-mappings/AbstractDO.mandantId"
value="">
</extension>
<extension vendor-name="kodo"
key="jdbc-field-mappings/AbstractDO.mandantId/jdbc-field-map"
value="value">
</extension>
<extension vendor-name="kodo"
key="jdbc-field-mappings/AbstractDO.mandantId/jdbc-field-map/column"
value="MANDANTID">
</extension>
.. fields ..
</class>
Many thanks,
Jan
Marc Prud'hommeaux
SolarMetric Inc. -
Generated Script fails when attempting to drop Foreign Key Constraint
I made some changes to my database. I used the generate script process to generate a drop and create script to these tables. The generated script first ran Alter Table Drop Constraints to drop the Foreign Key constraints and then did Drop tables
and then did create table to construct the script with the proper changes.
However, when we attempted to run the script, all of the Drop constraint statements failed reporting that there was no such constraint. Then the drop table scripts failed because of the existence of the very foreign key constraints that SQL Server
had just stated did not exist.
BOL states that the statement "DROP { [ CONSTRAINT ] constraint_name | COLUMN column_name } " is "Used in a CHECK, FOREIGN KEY, UNIQUE, or PRIMARY KEY constraint." So why couldn't I drop those specified Foreign
Key constraints in a script generated by SQL Server itself.
Edward R. Joell MCSD MCDBAAre you sure there are no Constraints on other tables which are causing your issue?
If a foreign key from table abc refences table def it will cause the drop to fail.
If your script is already attempting to drop such constraints, have you checked that they are dropping from the correct table (and not the table that would be the target of the drop)?
I discovered two things yesterday and one thing today about generated scripts.
When you generated a script to drop and create a set of tables and you mark it to include foreign keys, the generated script will first create a set a scripts to drop the foreign keys , then will create a set of statements for each table that will,
first, again drop the same foreign keys that it did earlier, then drop the table. If there is no "if exists" statement for each statement, the drop constraint will fail.
The script generated by the generate scripts wizard, even when you set the Drop and Create option in the advanced tab, unlike the scripts generated when you right click a table and select Drop and Create from the context menu, does not by default create
an "If Exists" statement before the attempt to drop anything.
You can make the generate Scripts wizard generate an "if exists" statement by changing the "Include if NOT EXISTS" option on the advanced tab to true. However, while the script generator will find all of the foreign keys that show that
table as the parent_id, it will not show the FK constraints on tables which are not being dropped and created. Nor can you find them by querying the sys.foreign_keys view using the standard type of Foreign Key "If Exists" statement because
it would do a query like
SELECT *
FROM sys.foreign_keys
WHERE object_id = OBJECT_ID(N'[dbo].[FK_prc_ContractSubLines_prc_PRSubLines]')
AND parent_object_id = OBJECT_ID(N'[dbo].[prc_ContractSubLines]')
And the script generator does not care even if you show an option like "Generate Scripts For Dependent Objects", it will not generate a drop script for the foreign constraints on other tables that reference your table. I have not even found
a way to get back the results of a query on the sys.foreign_keys view that will show those keys that reference your table. The only thing I been able to do is to open the table in design and check out the list of relationships in your table and see open each
relationship and see which table is the "foreign key table" rather than the primary key table. This will make writing drop and create scripts very very long and tedious. As you would have to create addional Alter tables scripts to do a drop
and create foreign keys on each table referencing yours and manually place them into your scripts at correct locations. This is almost as bad as the Oracle SQL Developer's generate script results which (at least in 2010) so screws up the order of the generated
script that it is trying to create foreign keys on tables it has not created yet.
So Patrick I see that you thought about the foreign keys on other tables. I wish I had read your post before spending the morning troubleshooting this issue based on this morning's script that ran and crashed embarrassingly.
I would like to know if someone has a query to reveal all of the foreign keys that reference your table from another table using the sys views. As it is I have to open each table in design to get a list of FKs that reference it.
Edward R. Joell MCSD MCDBA -
Is this a BUG??? Database Export not including Foreign Key Constraints
I'm using SQL Developer 1.5.4 with both the 59.47 and 59.59 patches installed. I want to do a database export from a 10g XE schema, and include all objects in the resulting DDL. So, I select ALL the checkboxes in the export wizard and when I get to Step 3 to specify objects, I don't see any of my constraints in the listbox... no foreign key constraints, no primary key constraints, no check constraints, nothing. Is this a bug, or is there a workaround, or what could I possibly be doing wrong? We want to be able to use the database export feature to easily transport and track modifications to our entire schema using source control compare.
Any help or alternate suggestions would be apprieciated.
Thanks,
MattThanks skutz, we just figured that out this morning. Also, it should be noted that you need to be logged in as the owner of the schema otherwise selecting nothing in the filter will give you nothing, but selecting items in the filter will give you those items even if you're not connected as the schema owner. I wonder if that is the detail of the Bug 8679318.
Edited by: mattsnyder on Jul 14, 2009 9:24 AM -
FOREIGN KEY CONSTRAINT 의 MASTER TABLE NAME 의 확인
제품 : ORACLE SERVER
작성날짜 : 1995-11-02
FOREIGN KEY CONSTRAINT 의 MASTER TABLE NAME 의 확인
===================================================
다음은 FOREIGN KEY CONSTRAINT 이름으로 REFERENCE 하는 TABLE
(MASTER TABLE)을 찾는 SQL SCRIPT이다.
col Primary_key_table format a20
col Constraint_name format a20
select a.object_name Primary_Key_table,
c.name Constraint_name
from dba_objects a,
sys.cdef$ b,
sys.con$ c
where c.name = 'EMP_FOREIGN_KEY' -- CONSTRAINT NAME
and b.con# = c.con#
and b.robj# = a.object_id
/The set of constraints as you show it is valid, but will likely result in a lot of violations since both child columns are larger than the parent. The Oracle 2256 error has nothing to do with data validation, nor with the different lengths of the columns. The documentation says
02256, 00000, "number of referencing columns must match referenced columns"
// *Cause: The number of columns in the foreign-key referencing list is not
// equal to the number of columns in the referenced list.
// *Action: Make sure that the referencing columns match the referenced
// columns.Look at the actual statement that the client ran. It will be different than the one you posted. one of the two column lists will have more columns than the other. -
Publish: dropping index when it is used for foreign key constraint enforcement
Hi,
I'm trying to update a target schema from a reference database via Publish. Among the changes to apply, there's an index that needs to be dropped. Since it's linked to a foreign key constraint, it cannot be deleted unless the foreign key is temporarily dropped
(I saw somewhere that disabling the foreign key should be enough but it doesn't seem to work either).
Since there are other changes to be made on the same table, this foreign key also has to be dropped before the script can delete the table and re-create it. This part of the script is correctly generated. The problem is that this part appears after the 'DROP
INDEX' instruction.
So when generating the update script, SSDT tries to drop the index BEFORE dropping the foreign key. And I can't drop the foreign key in my custom pre-deployment script, otherwise the update script would fail when trying to delete it again.
Shouldn't SSDT be smart enough to drop the constraint before the index? Is it a bug or did I forget to set an option? If it's not a bug, what can I do apart from doing it manually?
Thank you for your helpHi Elsa,
That sounds like a bug. Could you please file a Connect issue for this at
https://connect.microsoft.com/SQLServer/feedback/CreateFeedback.aspx using the category "Developer Tools (SSDT, BIDS, etc.)"? We're trying to track all bugs through
Connect so that you can tell when we have fixed the issue and we can request more information.
A workaround for this issue might be to write a pre-deployment script for your project to drop the foreign key prior to deployment. A pre-deployment script can be added to your project by right-clicking on the
project in solution explorer and then clicking on Add > Script... and selecting Pre-Deployment Script from the list.
Thanks!
Maybe you are looking for
-
Strategy Plan-with different Counters??
Dear Experts, I had a scenario, which my client want : There are many similar equipments say "Pumps". So, for 5 similar pumps, they want a single plan which will include all 5 pumps (say in OBJECT lists). Now the thing is that 2 of the pumps are stan
-
Adding a title to a still image in iMovie for iPhone 4
I would like to add a title for a still image using iMovie for iPhone 4. Is this possible? I can't see an option for this and it seems simple enough. I can add titles on video clips, but not on still images. Any suggestions?
-
Installation issue with Elements/Premiere 12 bundle
I haven't been able to install the Elements/Premiere 12 bundle I recently purchased at a Best Buy Store. The installation screen says invalid serial number when I entered the serial number on the back of the box. I also tried using the included r
-
Still Images Rippling After Export
I'm exporting a 1920x1080 video from FCP. Everything looks great on the final export, except three images ripple badly while in motion. This doesn't happen on the timeline. Plus, other images come out just fine. So the issue seems inconsistent. Any t
-
How can I export an flex chart to excel? Does anyone have any sample code.