foreign key not displaying as null after input - javascript

i have created a dabasehelper class with three tables, i want student table primary key to be the foreign key in examResult table. But when i enter data in examResult table it display the foreign key column as null
public void onCreate(SQLiteDatabase db) {
String query2 = "CREATE TABLE IF NOT EXISTS \"student_and_parent_table1\" ( `ID` integer PRIMARY KEY AUTOINCREMENT, `Name` TEXT, `FatherName` TEXT, `MotherName` TEXT, `ParentEmail` TEXT, `FatherPhoneNumber` INTEGER, `MotherPhoneNumber` INTEGER, `Address` TEXT, `Username` TEXT, `Password` TEXT)";
db.execSQL(query2);
String query3 = "CREATE TABLE IF NOT EXISTS \"teacher_table1\" ( `ID` integer PRIMARY KEY AUTOINCREMENT, `Name` TEXT, `Email` TEXT, `MobileNumber` INTEGER, `Username` TEXT, `Password` text, `Address` text, `Qualification` TEXT )";
db.execSQL(query3);
String query4 = "CREATE TABLE IF NOT EXISTS \"exam_table1\" ( `StudentID` INTEGER PRIMARY KEY AUTOINCREMENT, `StudentName` TEXT, `SubjectName` TEXT, `SubjectCode` TEXT, `MaxMarks` INTEGER, `MarksScoredByStudent` INTEGER, `Grade` TEXT, `StudentRegNo` integer, FOREIGN KEY(StudentRegNo) REFERENCES student_and_parent_table1(ID) )";
db.execSQL(query4);

There are two potential issues (due to the limited code provided it is impossible to tell exactly why NULL's are being inserted).
Issue 1 - Foreign Key Support
The first is that by default Foreign Key support is turned off and therefore needs to be turned on. To turn foreign key support on you can override the database helper's onConfigure method to call the SQLiteDatabase's setForeignKeyConstraintsEnabled method e.g.
#Override
public void onConfigure(SQLiteDatabase db) {
super.onConfigure(db);
db.setForeignKeyConstraintsEnabled(true);
}
Issue 2 - Constraints
The second is a common misunderstanding about what Foreign Keys are.
When you define a Foreign Key you are simply adding a constraint (rule) that says that a value in the child column MUST be a value that exists in the parent column. NULL being an exception/special case that indicates no relation to a parent (unless a NOT NULL constraint is applied to the child column).
A common misunderstanding is that specifying a Foreign Key automatically assigns values, it does not, it only checks that the value being inserted is a valid value, you still have to programatically determine the value to be inserted.
As such you may wish to add a NOT NULL constraint to the child (StudentRegNo) column, which would enforce the use of a valid value.
e.g. use :-
String query4 = "CREATE TABLE IF NOT EXISTS \"exam_table1\" ( `StudentID` INTEGER PRIMARY KEY AUTOINCREMENT, `StudentName` TEXT, `SubjectName` TEXT, `SubjectCode` TEXT, `MaxMarks` INTEGER, `MarksScoredByStudent` INTEGER, `Grade` TEXT, `StudentRegNo` integer NOT NULL, FOREIGN KEY(StudentRegNo) REFERENCES student_and_parent_table1(ID) )";

Related

Mysql Error 1452 - sqlMessage: "Cannot add or update a child row: a foreign key constraint fails [duplicate]

I'm having a bit of a strange problem. I'm trying to add a foreign key to one table that references another, but it is failing for some reason. With my limited knowledge of MySQL, the only thing that could possibly be suspect is that there is a foreign key on a different table referencing the one I am trying to reference.
I've done a SHOW CREATE TABLE query on both tables, sourcecodes_tags is the table with the foreign key, sourcecodes is the referenced table.
CREATE TABLE `sourcecodes` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`user_id` int(11) unsigned NOT NULL,
`language_id` int(11) unsigned NOT NULL,
`category_id` int(11) unsigned NOT NULL,
`title` varchar(40) CHARACTER SET utf8 NOT NULL,
`description` text CHARACTER SET utf8 NOT NULL,
`views` int(11) unsigned NOT NULL,
`downloads` int(11) unsigned NOT NULL,
`time_posted` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `user_id` (`user_id`),
KEY `language_id` (`language_id`),
KEY `category_id` (`category_id`),
CONSTRAINT `sourcecodes_ibfk_3` FOREIGN KEY (`language_id`) REFERENCES `languages` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `sourcecodes_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `sourcecodes_ibfk_2` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1
CREATE TABLE `sourcecodes_tags` (
`sourcecode_id` int(11) unsigned NOT NULL,
`tag_id` int(11) unsigned NOT NULL,
KEY `sourcecode_id` (`sourcecode_id`),
KEY `tag_id` (`tag_id`),
CONSTRAINT `sourcecodes_tags_ibfk_1` FOREIGN KEY (`tag_id`) REFERENCES `tags` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1
This is the code that generates the error:
ALTER TABLE sourcecodes_tags ADD FOREIGN KEY (sourcecode_id) REFERENCES sourcecodes (id) ON DELETE CASCADE ON UPDATE CASCADE
Quite likely your sourcecodes_tags table contains sourcecode_id values that no longer exists in your sourcecodes table. You have to get rid of those first.
Here's a query that can find those IDs:
SELECT DISTINCT sourcecode_id FROM
sourcecodes_tags tags LEFT JOIN sourcecodes sc ON tags.sourcecode_id=sc.id
WHERE sc.id IS NULL;
I had the same issue with my MySQL database but finally, I got a solution which worked for me.
Since in my table everything was fine from the mysql point of view(both tables should use InnoDB engine and the datatype of each column should be of the same type which takes part in foreign key constraint).
The only thing that I did was to disable the foreign key check and later on enabled it after performing the foreign key operation.
Steps that I took:
SET foreign_key_checks = 0;
alter table tblUsedDestination add constraint f_operatorId foreign key(iOperatorId) references tblOperators (iOperatorId); Query
OK, 8 rows affected (0.23 sec) Records: 8 Duplicates: 0 Warnings: 0
SET foreign_key_checks = 1;
Use NOT IN to find where constraints are constraining:
SELECT column FROM table WHERE column NOT IN
(SELECT intended_foreign_key FROM another_table)
so, more specifically:
SELECT sourcecode_id FROM sourcecodes_tags WHERE sourcecode_id NOT IN
(SELECT id FROM sourcecodes)
EDIT: IN and NOT IN operators are known to be much faster than the JOIN operators, as well as much easier to construct, and repeat.
Truncate the tables and then try adding the FK Constraint.
I know this solution is a bit awkward but it does work 100%. But I agree that this is not an ideal solution to deal with problem, but I hope it helps.
For me, this problem was a little different and super easy to check and solve.
You must ensure BOTH of your tables are InnoDB. If one of the tables, namely the reference table is a MyISAM, the constraint will fail.
SHOW TABLE STATUS WHERE Name = 't1';
ALTER TABLE t1 ENGINE=InnoDB;
This also happens when setting a foreign key to parent.id to child.column if the child.column has a value of 0 already and no parent.id value is 0
You would need to ensure that each child.column is NULL or has value that exists in parent.id
And now that I read the statement nos wrote, that's what he is validating.
I had the same problem today. I tested for four things, some of them already mentioned here:
Are there any values in your child column that don't exist in the parent column (besides NULL, if the child column is nullable)
Do child and parent columns have the same datatype?
Is there an index on the parent column you are referencing? MySQL seems to require this for performance reasons (http://dev.mysql.com/doc/refman/5.5/en/create-table-foreign-keys.html)
And this one solved it for me: Do both tables have identical collation?
I had one table in UTF-8 and the other in iso-something. That didn't work. After changing the iso-table to UTF-8 collation the constraints could be added without problems. In my case, phpMyAdmin didn't even show the child table in iso-encoding in the dropdown for creating the foreign key constraint.
It seems there is some invalid value for the column line 0 that is not a valid foreign key so MySQL cannot set a foreign key constraint for it.
You can follow these steps:
Drop the column which you have tried to set FK constraint for.
Add it again and set its default value as NULL.
Try to set a foreign key constraint for it again.
I'd the same problem, I checked rows of my tables and found there was some incompatibility with the value of fields that I wanted to define a foreign key. I corrected those value, tried again and the problem was solved.
I end up delete all the data in my table, and run alter again. It works. Not the brilliant one, but it save a lot time, especially your application is still in development stage without any customer data.
try this
SET foreign_key_checks = 0;
ALTER TABLE sourcecodes_tags ADD FOREIGN KEY (sourcecode_id) REFERENCES sourcecodes (id) ON DELETE CASCADE ON UPDATE CASCADE
SET foreign_key_checks = 1;
I had this exact same problem about three different times. In each instance it was because one (or more) of my records did not conform to the new foreign key. You may want to update your existing records to follow the syntax constraints of the foreign key before trying to add the key itself. The following example should generally isolate the problem records:
SELECT * FROM (tablename)
WHERE (candidate key) <> (proposed foreign key value)
AND (candidate key) <> (next proposed foreign key value)
repeat AND (candidate key) <> (next proposed foreign key value) within your query for each value in the foreign key.
If you have a ton of records this can be difficult, but if your table is reasonably small it shouldn't take too long. I'm not super amazing in SQL syntax, but this has always isolated the issue for me.
Empty both your tables' data and run the command. It will work.
I was getting this error when using Laravel and eloquent, trying to make a foreign key link would cause a 1452. The problem was lack of data in the linked table.
Please see here for an example: http://mstd.eu/index.php/2016/12/02/laravel-eloquent-integrity-constraint-violation-1452-foreign-key-constraint/
You just need to answer one question:
Is your table already storing data? (Especially the table included foreign key.)
If the answer is yes, then the only thing you need to do is to delete all the records, then you are free to add any foreign key to your table.
Delete instruction: From child(which include foreign key table) to parent table.
The reason you cannot add in foreign key after data entries is due to the table inconsistency, how are you going to deal with a new foreign key on the former data-filled the table?
If the answer is no, then follow other instructions.
I was readying this solutions and this example may help.
My database have two tables (email and credit_card) with primary keys for their IDs. Another table (client) refers to this tables IDs as foreign keys. I have a reason to have the email apart from the client data.
First I insert the row data for the referenced tables (email, credit_card) then you get the ID for each, those IDs are needed in the third table (client).
If you don't insert first the rows in the referenced tables, MySQL wont be able to make the correspondences when you insert a new row in the third table that reference the foreign keys.
If you first insert the referenced rows for the referenced tables, then the row that refers to foreign keys, no error occurs.
Hope this helps.
Make sure the value is in the other table otherwise you will get this error, in the assigned corresponding column.
So if it is assigned column is assigned to a row id of another table , make sure there is a row that is in the table otherwise this error will appear.
you can try this exapmple
START TRANSACTION;
SET foreign_key_checks = 0;
ALTER TABLE `job_definers` ADD CONSTRAINT `job_cities_foreign` FOREIGN KEY
(`job_cities`) REFERENCES `drop_down_lists`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
SET foreign_key_checks = 1;
COMMIT;
Note : if you are using phpmyadmin just uncheck Enable foreign key checks
as example
hope this soloution fix your problem :)
UPDATE sourcecodes_tags
SET sourcecode_id = NULL
WHERE sourcecode_id NOT IN (
SELECT id FROM sourcecodes);
should help to get rid of those IDs. Or if null is not allowed in sourcecode_id, then remove those rows or add those missing values to the sourcecodes table.
I had the same problem and found solution, placing NULL instead of NOT NULL on foreign key column. Here is a query:
ALTER TABLE `db`.`table1`
ADD COLUMN `col_table2_fk` INT UNSIGNED NULL,
ADD INDEX `col_table2_fk_idx` (`col_table2_fk` ASC),
ADD CONSTRAINT `col_table2_fk1`
FOREIGN KEY (`col_table2_fk`)
REFERENCES `db`.`table2` (`table2_id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
MySQL has executed this query!
In my case, I created a new table with the same structure, created the relationships with the other tables, then extracted the data in CSV from the old table that has the problem, then imported the CSV to the new table and disabled foreign key checking and disabled import interruption, all my data are inserted to the new table that has no problem successfully, then deleted the old table.
It worked for me.

Issue with mysql command

I have a table called benificiaries with following columns
custid varchar
accno varchar primarykey
name varchar
I have one record in that table with values
101
12345
john
Now I need to insert a record for another custid but same accno
var data={"custid":"102","accno":"12345","name":"john"};
con.query('insert into benificiaries set ?',data)
But it is not allowing since accno is primary key..So how can i insert this?I can have same accountno once for different custid..Any ideas?
Check out your MySQL code here:
CREATE TABLE beneficiaries (
custid INT PRIMARY KEY,
accno INT,
name varchar(30)
);
Set custid as primary keys and observe the datatypes I've used for each column.
That is not possible, you have make accno and custid as composite key
You simply can't do this, because you've defined accno as primary key.
Primary key is exactly that - the primary key of the record. It is a unique value that positively identifies that record and only that record. If you can't guarantee that data to be unique per record, it cannot be your primary key.
This table seems like a mapping table, to me. Is it?
If so, it really doesn't need a primary key. If you absolutely MUST give it a primary key, for some reason, then just give the table a surrogate key using an autoincrementing integer column and make that the primary key for this table.
How is this table being used?
I'd say screw a primary key and just index on both accno and custid columns (if you do lookups by each).
If the combination of accno and custid is unique (probably is, given what this table seems to be), then you can define your primary key as a combination of accno and custid.
If, for some reason, you need to be able to have more than one record with the same values for both of those fields, then you have no natural key in this table anyway.
Because there can be multiple entries with the same accno, accno isn't a primary key. Make a compound primary key from accno and custid, and you should be set.
CREATE TABLE beneficiaries (
custid INT,
accno INT,
name varchar
PRIMARY KEY (custid, accno)
)

JS Knex: getting foreign keys for a table

I want to drop some tables using 'knex' but I have an error Cannot delete or update a parent row: a foreign key constraint fails when I try to drop table with foreign key:
knex.schema.dropTableIfExists(name);
I can use dropForeign() function to drop foreign key but I need to know foreign key name.
How can I get foreign key names using 'knex'?
The usual foreign key index naming format in knex is : tableName_columnName_foreign.
Eg: If you have in table chat a foreign key named visitor_id then its index name will be : chat_visitor_id_foreign
That said,you wouldn't need this, unless someone has explicitly overridden the default foreign key name. In that case , search for it in the migration file or look it up in the database .

Double primary key $cordovaSQLite

how can i create a table with 2 primary key with $cordovaSQLite?
My code:
$cordovaSQLite.execute(db, 'CREATE TABLE IF NOT EXISTS mytable(id INTEGER PRIMARY KEY AUTOINCREMENT, num INTEGER PRIMARY KEY, text TEXT)');
It is possibile?
Setting two primary keys is not possible, but you can set a unique constraint on any fields you want to act like a primary key. You can emulate autoincrementing on this field by looking at this question: SQLite auto-increment non-primary key field. Hope this helps.

One to many Foreign Key relation Sqlite

So right now I'm trying to draw relations between 3 different tables using sqlite I'm relatively new to sqlite but saw that you can draw relations by using foreign keys thus optimizing performance. So right now here is my sql statements creating my tables:
'CREATE TABLE IF NOT EXISTS shifts (
shifts_id primary integer,
shift_base_id integer,
shift_site_id integer)';
'CREATE TABLE IF NOT EXISTS sites (
site_id primary integer,
site_info text,
FOREIGN KEY(site_id) REFERENCES shifts(shift_site_id))';
'CREATE TABLE IF NOT EXISTS bases (
base_id primary integer,
base_info text,
FOREIGN KEY(base_id) REFERENCES shifts(shift_base_id))';
So what I'm trying to do is draw relations between the child tables (sites and bases) with the parent table (shifts) by the id. The problem I'm running into is I'm getting a "foreign key mismatch" error. I read somewhere that in sqlite you can only REFERENCE a primary or unique key within the parent table. The problem with this is that multiple shifts can share the same sites and bases. For instance base_id could equal 1234 and multiple shifts would have shifts_base_id = 1234.
Also there will be times where a base_id in the bases table wont have a matching shift_base_id in the shifts table.
So my question is how to reference this one to many relation between multiple tables? And how to make that relation optional.
You have your relationships backwards. You list the foreign keys in the table that reference the other tables.
CREATE TABLE IF NOT EXISTS shifts (
shifts_id primary integer,
shift_base_id integer,
shift_site_id integer,
FOREIGN KEY (shift_base_id) REFERENCES bases (base_id),
FOREIGN KEY (shift_site_id) REFERENCES site (site_id));

Categories

Resources