MySQL Naming conventions - mysql

I'm recreating this database (that I had originally made from django modelw) on an Amazon EC2 instance. I used MySQL workbench to translate the database into a mockup, and then had it forward-engineer it to all the CREATE statements in a .sql file. However some of the foreign key stuff is named really strangely, and I'm not sure what parts I can take out or rename and what parts are necessary. Here's a sample of the code that I'm talking about.
CREATE TABLE IF NOT EXISTS `gamelydb`.`quotes` (
`id` INT(11) NOT NULL AUTO_INCREMENT ,
`game_id` INT(11) NOT NULL ,
`quotetext` VARCHAR(400) NOT NULL ,
`speaker_id` INT(11) NOT NULL ,
PRIMARY KEY (`id`) ,
INDEX `quotes_7b333d1e` (`game_id` ASC) ,
INDEX `quotes_7171bad0` (`speaker_id` ASC) ,
CONSTRAINT `game_id_refs_id_274910a8`
FOREIGN KEY (`game_id` )
REFERENCES `gamelydb`.`game` (`id` ),
CONSTRAINT `speaker_id_refs_id`
FOREIGN KEY (`speaker_id` )
REFERENCES `gamelydb`.`person` (`id` ))
ENGINE = InnoDB DEFAULT CHARACTER SET = latin1;
So like where it has "INDEX 'quotes_randomstuff'" or 'speaker_id_refs_id', do I need all the random stuff or what should I rename it to for clarity's/practicality's sake?

According to this you probably need it. It's an ID.

Related

Can't write; duplicate key in table

-- Table Project_DB.Product_table
CREATE TABLE IF NOT EXISTS `Project_DB`.`Product_table`
(
`Product_id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
`User_id_fk` INT UNSIGNED NOT NULL ,
`Product_Category_id` INT UNSIGNED NOT NULL ,
`Product_Name` VARCHAR( 45 ) NOT NULL ,
`Product_Price` INT UNSIGNED NOT NULL ,
`Product_details` MEDIUMTEXT NULL ,
PRIMARY KEY ( `Product_id` ) ,
INDEX `User_id_idx` ( `User_id_fk` ASC ) ,
CONSTRAINT `User_id` FOREIGN KEY ( `User_id_fk` )
REFERENCES `Project_DB`.`Registration_table` ( `User_id` )
ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE = INNODB;
MySQL said: Documentation
#1022 - Can't write; duplicate key in table 'product_table'
The Database Schema Cannot have two or more FOREIGN KEY with same name. I change all FOREIGN KEYS to different names in my DB Schema then it works...
I recommend you try removing the line
INDEX `User_id_idx` ( `User_id_fk` ASC ) ,
Either that, or remove the foreign key constraint from the table definition, and add that in a separate ALTER TABLE statement.
InnoDB automatically creates the required index when a foreign key constraint is added, or uses a suitable index if it's already there.
I believe the error is occurring because InnoDB is attempting to create an index for the foreign key, rather than using the index that was defined previously. That is, when the CREATE TABLE statement (as posted by OP) is processed, InnoDB is attempting to create both the index defined on User_id_fk, and the index required for the foreign key.
And those two indexes are "duplicates" of each other.
The workaround is to modify the CREATE TABLE statement, to avoid InnoDB attempting to create "duplicate" indexes.
I had the same problem, MySQLWorkbench was working fine when I forward engineered a build script and then it decided to throw it's toys out of the pram.
I fixed the problem by dropping my database in phpMyAdmin and then ran the script again from MySQLWorkbench and it worked. I suspect I'd changed something that caused a conflict.
I know this is an extreme measure; others have said, to go through the DB schema and find duplicates.
Usually, you already use that constraint in another table that you also use for foreign key.

The "cannot be added because it does not have a primary key" bug in NetBeans

I try to create a Entity Class from my MySQL Database. The wizard in Netbeans give me the error message "cannot be added because it does not have a primary key". But i got a primary key in my table. It seems to be a bug that others have encountered in this forum:
https://netbeans.org/bugzilla/show_bug.cgi?id=167389
I have tried the suggestions in the thread but have not gotten it to work. what am I missing? Can I force Netbeans to import the Entity class?
Im using NetBeans 7.3
Here is my table:
CREATE TABLE IF NOT EXISTS `estelle`.`FrasVal` (
`ID` INT(11) NOT NULL AUTO_INCREMENT ,
`Varde` VARCHAR(45) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NOT NULL ,
`Kommentar` VARCHAR(255) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NULL ,
`RegistreratDatum` DATETIME NOT NULL ,
`FrasFragaSvarAlternativ_ID` INT(11) NULL ,
`Anvandare_ID` INT(11) NOT NULL ,
`Patient_ID` INT(11) NOT NULL ,
`FrasFraga_ID` INT(11) NOT NULL ,
PRIMARY KEY (`ID`) ,
UNIQUE INDEX `ID_UNIQUE` (`ID` ASC) ,
INDEX `fk_FrasVal_FrasFragaSvarAlternativ1_idx` (`FrasFragaSvarAlternativ_ID` ASC) ,
INDEX `fk_FrasVal_Anvandare1_idx` (`Anvandare_ID` ASC) ,
INDEX `fk_FrasVal_Patient1_idx` (`Patient_ID` ASC) ,
INDEX `fk_FrasVal_FrasFraga1_idx` (`FrasFraga_ID` ASC) ,
CONSTRAINT `fk_FrasVal_FrasFragaSvarAlternativ1`
FOREIGN KEY (`FrasFragaSvarAlternativ_ID` )
REFERENCES `estelle`.`FrasFragaSvarAlternativ` (`ID` )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_FrasVal_Anvandare1`
FOREIGN KEY (`Anvandare_ID` )
REFERENCES `estelle`.`Anvandare` (`ID` )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_FrasVal_Patient1`
FOREIGN KEY (`Patient_ID` )
REFERENCES `estelle`.`Patient` (`ID` )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_FrasVal_FrasFraga1`
FOREIGN KEY (`FrasFraga_ID` )
REFERENCES `estelle`.`FrasFraga` (`ID` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_unicode_ci;
I have tried the suggestions in the thread but have not gotten it to work.
Are you sure? The code sample you have posted don't show that. If necessary, update your question to reflect the actual state of your problem.
According to the link you provided, a possible (?) workaround would be to spell you table all lowercase:
"Something that gave me a hard time is that for some funky reason the
table names must be all in lower case. If tables names are in mixed
case the relationships will not be discovered during the reverse
engineering process. During my experimentation I discovered that the
Middlegen docs give a warning about this, so I am guessing that the
Eclipse DALI plugin uses Middlegen under the covers. The MySQL engine
should also be INNODB."
And https://netbeans.org/bugzilla/show_bug.cgi?id=167389#c11
The problem will happen if you have foreign keys where upper case and
lower case table names don't match the referenced table's definition.
I would suggest (1) to use all lowercase table names and (2) ensure that table references are spelled the same on foreign key constraints.
CREATE TABLE IF NOT EXISTS `estelle`.`frasval` (
-- ^^^^^^^
...
REFERENCES `estelle`.`frasfragasvaralternativ` (`ID` )
-- ^ ^ ^ ^
You should probably be able to use underscore _ in your table name as well (definitively make things more readable!). Please post your conclusions if you have time to made some experiments!
When I got the error I removed the foreign keys, added them again, restarted the mysql connection and it worked
It is because the first character on the name of your field "ID" is Uppercase. Try with 'id'. I know, sounds fool but this worked for me.

Error 1215: Cannot add foreign key constraint

I built a database with mySql Workbench, but when I try to forward engineer my model to the server, I get the following error :
ERROR: Error 1215: Cannot add foreign key constraint
followed by the definition of the table where the foreign key is defined, salaire_annee_ca
I read similar topics to identify the usual causes for this error, and checked :
if the foreign key defined in salaire_annee_ca references the primary key of another table, which it does
if something in the code allowed my key to be null, which it doesn't
if the types of the reference and of the foreign key were the same
It seems to me that all these conditions are ok, so I don't understand why I still get that message. Here are the definitions of my tables :
These are the two main ones :
-- Table `credit_impot_db`.`salaires_annee`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `credit_impot_db`.`salaires_annee` (
`salaire_annee_id` INT(11) NOT NULL ,
`salaire_annuel` DOUBLE NOT NULL DEFAULT 0 ,
`heures_travaillees` DOUBLE NOT NULL DEFAULT 0 ,
`pourcentage_rsde` DOUBLE NOT NULL DEFAULT 0 ,
`jours_travailles` INT(3) NOT NULL DEFAULT 0 ,
PRIMARY KEY (`salaire_annee_id`) ,
CONSTRAINT `salaire_annee_id`
FOREIGN KEY (`salaire_annee_id` )
REFERENCES `credit_impot_db`.`employes_ac` (`employe_ac_id` )
ON DELETE CASCADE
ON UPDATE CASCADE)
ENGINE = InnoDB;
This one is at the origin of the message :
-- -----------------------------------------------------
-- Table `credit_impot_db`.`salaire_annee_ca`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `credit_impot_db`.`salaire_annee_ca` (
`salaire_annee_ca_id` INT(11) NOT NULL ,
PRIMARY KEY (`salaire_annee_ca_id`) ,
CONSTRAINT `salaire_annee_ca_id`
FOREIGN KEY (`salaire_annee_ca_id` )
REFERENCES `credit_impot_db`.`salaires_annee` (`salaire_annee_id` )
ON DELETE CASCADE
ON UPDATE CASCADE)
ENGINE = InnoDB;
And the following two are also referenced :
-- -----------------------------------------------------
-- Table `credit_impot_db`.`employes`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `credit_impot_db`.`employes` (
`employe_id` INT(11) NOT NULL AUTO_INCREMENT ,
`employe_nom` VARCHAR(255) NOT NULL ,
`employe_prenom` VARCHAR(255) NOT NULL ,
`employe_fonction` VARCHAR(255) NULL ,
`employe_experience` VARCHAR(255) NULL DEFAULT NULL ,
PRIMARY KEY (`employe_id`) )
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `credit_impot_db`.`employes_ac`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `credit_impot_db`.`employes_ac` (
`employe_ac_id` INT(11) NOT NULL AUTO_INCREMENT ,
`fk_employe_ac_employe_id` INT(11) NULL ,
`fk_employe_ac_ac_id` INT(11) NULL ,
PRIMARY KEY (`employe_ac_id`) ,
INDEX `fk_employe_ac_employe_id_idx` (`fk_employe_ac_employe_id` ASC) ,
INDEX `fk_employe_ac_ac_id_idx` (`fk_employe_ac_ac_id` ASC) ,
CONSTRAINT `fk_employe_ac_employe_id`
FOREIGN KEY (`fk_employe_ac_employe_id` )
REFERENCES `credit_impot_db`.`employes` (`employe_id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_employe_ac_ac_id`
FOREIGN KEY (`fk_employe_ac_ac_id` )
REFERENCES `credit_impot_db`.`dossier_client` (`ac_id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
Any help would be appreciated!
I hit the dreaded error 1215 while using the Workbench and spent a long time trying to work out what was wrong. I eventually noticed that some of my tables were defined with "latin1 - default collation", while others were defined with "Schema Default". I had to expand the table definitions one by one in the EER diagram to see the option to change this. I changed all the definitions to "Schema Default" and the problem disappeared. Wow!
Ok I think I figured it out. It seems to be a problem with mySql Workbench, the error disappears if :
I first create my primary key in salaire_annee_ca,
Then Forward engineer my database
Declare my primary key as being a foreign key which references the primary key of salaire_annee
Forward engineer my database again
The error gets resolved:
To create a Foreign key for a table like this
CREATE TABLE users_so
(
username VARCHAR(10) NOT NULL,
password VARCHAR(32) NOT NULL,
enabled SMALLINT,
PRIMARY KEY (username)
);
The below code works fine
CREATE TABLE authorities_so
(
username VARCHAR(10) NOT NULL,
authority VARCHAR(10) NOT NULL,
FOREIGN KEY (username) REFERENCES users_so(username)
);
One of possible cause could be default storage engine on production db.
My problem was similar. I also worked with Workbench, and in local worked perfectly, also worked good in production, until I recreate schema on production server with Forward Engineering.
One of tables become MyISAM instead of InnoDb, and Row format from Don't use become Dynamic.
My solution was:
In Workbench,
Check every table that requires foreign keys to be InnoDb, and
Row format to be Default.

MySQL Cannot Add Foreign Key Constraint

So I'm trying to add Foreign Key constraints to my database as a project requirement and it worked the first time or two on different tables, but I have two tables on which I get an error when trying to add the Foreign Key Constraints.
The error message that I get is:
ERROR 1215 (HY000): Cannot add foreign key constraint
This is the SQL I'm using to create the tables, the two offending tables are Patient and Appointment.
SET #OLD_UNIQUE_CHECKS=##UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET #OLD_FOREIGN_KEY_CHECKS=##FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=1;
SET #OLD_SQL_MODE=##SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';
CREATE SCHEMA IF NOT EXISTS `doctorsoffice` DEFAULT CHARACTER SET utf8 ;
USE `doctorsoffice` ;
-- -----------------------------------------------------
-- Table `doctorsoffice`.`doctor`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `doctorsoffice`.`doctor` ;
CREATE TABLE IF NOT EXISTS `doctorsoffice`.`doctor` (
`DoctorID` INT(11) NOT NULL AUTO_INCREMENT ,
`FName` VARCHAR(20) NULL DEFAULT NULL ,
`LName` VARCHAR(20) NULL DEFAULT NULL ,
`Gender` VARCHAR(1) NULL DEFAULT NULL ,
`Specialty` VARCHAR(40) NOT NULL DEFAULT 'General Practitioner' ,
UNIQUE INDEX `DoctorID` (`DoctorID` ASC) ,
PRIMARY KEY (`DoctorID`) )
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;
-- -----------------------------------------------------
-- Table `doctorsoffice`.`medicalhistory`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `doctorsoffice`.`medicalhistory` ;
CREATE TABLE IF NOT EXISTS `doctorsoffice`.`medicalhistory` (
`MedicalHistoryID` INT(11) NOT NULL AUTO_INCREMENT ,
`Allergies` TEXT NULL DEFAULT NULL ,
`Medications` TEXT NULL DEFAULT NULL ,
`ExistingConditions` TEXT NULL DEFAULT NULL ,
`Misc` TEXT NULL DEFAULT NULL ,
UNIQUE INDEX `MedicalHistoryID` (`MedicalHistoryID` ASC) ,
PRIMARY KEY (`MedicalHistoryID`) )
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;
-- -----------------------------------------------------
-- Table `doctorsoffice`.`Patient`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `doctorsoffice`.`Patient` ;
CREATE TABLE IF NOT EXISTS `doctorsoffice`.`Patient` (
`PatientID` INT unsigned NOT NULL AUTO_INCREMENT ,
`FName` VARCHAR(30) NULL ,
`LName` VARCHAR(45) NULL ,
`Gender` CHAR NULL ,
`DOB` DATE NULL ,
`SSN` DOUBLE NULL ,
`MedicalHistory` smallint(5) unsigned NOT NULL,
`PrimaryPhysician` smallint(5) unsigned NOT NULL,
PRIMARY KEY (`PatientID`) ,
UNIQUE INDEX `PatientID_UNIQUE` (`PatientID` ASC) ,
CONSTRAINT `FK_MedicalHistory`
FOREIGN KEY (`MEdicalHistory` )
REFERENCES `doctorsoffice`.`medicalhistory` (`MedicalHistoryID` )
ON DELETE CASCADE
ON UPDATE CASCADE,
CONSTRAINT `FK_PrimaryPhysician`
FOREIGN KEY (`PrimaryPhysician` )
REFERENCES `doctorsoffice`.`doctor` (`DoctorID` )
ON DELETE CASCADE
ON UPDATE CASCADE)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `doctorsoffice`.`Appointment`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `doctorsoffice`.`Appointment` ;
CREATE TABLE IF NOT EXISTS `doctorsoffice`.`Appointment` (
`AppointmentID` smallint(5) unsigned NOT NULL AUTO_INCREMENT ,
`Date` DATE NULL ,
`Time` TIME NULL ,
`Patient` smallint(5) unsigned NOT NULL,
`Doctor` smallint(5) unsigned NOT NULL,
PRIMARY KEY (`AppointmentID`) ,
UNIQUE INDEX `AppointmentID_UNIQUE` (`AppointmentID` ASC) ,
CONSTRAINT `FK_Patient`
FOREIGN KEY (`Patient` )
REFERENCES `doctorsoffice`.`Patient` (`PatientID` )
ON DELETE CASCADE
ON UPDATE CASCADE,
CONSTRAINT `FK_Doctor`
FOREIGN KEY (`Doctor` )
REFERENCES `doctorsoffice`.`doctor` (`DoctorID` )
ON DELETE CASCADE
ON UPDATE CASCADE)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `doctorsoffice`.`InsuranceCompany`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `doctorsoffice`.`InsuranceCompany` ;
CREATE TABLE IF NOT EXISTS `doctorsoffice`.`InsuranceCompany` (
`InsuranceID` smallint(5) NOT NULL AUTO_INCREMENT ,
`Name` VARCHAR(50) NULL ,
`Phone` DOUBLE NULL ,
PRIMARY KEY (`InsuranceID`) ,
UNIQUE INDEX `InsuranceID_UNIQUE` (`InsuranceID` ASC) )
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `doctorsoffice`.`PatientInsurance`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `doctorsoffice`.`PatientInsurance` ;
CREATE TABLE IF NOT EXISTS `doctorsoffice`.`PatientInsurance` (
`PolicyHolder` smallint(5) NOT NULL ,
`InsuranceCompany` smallint(5) NOT NULL ,
`CoPay` INT NOT NULL DEFAULT 5 ,
`PolicyNumber` smallint(5) NOT NULL AUTO_INCREMENT ,
PRIMARY KEY (`PolicyNumber`) ,
UNIQUE INDEX `PolicyNumber_UNIQUE` (`PolicyNumber` ASC) ,
CONSTRAINT `FK_PolicyHolder`
FOREIGN KEY (`PolicyHolder` )
REFERENCES `doctorsoffice`.`Patient` (`PatientID` )
ON DELETE CASCADE
ON UPDATE CASCADE,
CONSTRAINT `FK_InsuranceCompany`
FOREIGN KEY (`InsuranceCompany` )
REFERENCES `doctorsoffice`.`InsuranceCompany` (`InsuranceID` )
ON DELETE CASCADE
ON UPDATE CASCADE)
ENGINE = InnoDB;
USE `doctorsoffice` ;
SET SQL_MODE=#OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=#OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=#OLD_UNIQUE_CHECKS;
To find the specific error run this:
SHOW ENGINE INNODB STATUS;
And look in the LATEST FOREIGN KEY ERROR section.
The data type for the child column must match the parent column exactly. For example, since medicalhistory.MedicalHistoryID is an INT, Patient.MedicalHistory also needs to be an INT, not a SMALLINT.
Also, you should run the query set foreign_key_checks=0 before running the DDL so you can create the tables in an arbitrary order rather than needing to create all parent tables before the relevant child tables.
I had set one field as "Unsigned" and other one not. Once I set both columns to Unsigned it worked.
Engine should be the same e.g. InnoDB
Datatype should be the same, and with same length. e.g. VARCHAR(20)
Collation Columns charset should be the same. e.g. utf8
Watchout: Even if your tables have same Collation, columns still could have different one.
Unique - Foreign key should refer to field that is unique (usually primary key) in the reference table.
Try to use the same type of your primary keys - int(11) - on the foreign keys - smallint(5) - as well.
Hope it helps!
Confirm that the character encoding and collation for the two tables is the same.
In my own case, one of the tables was using utf8 and the other was using latin1.
I had another case where the encoding was the same but the collation different. One utf8_general_ci the other utf8_unicode_ci
You can run this command to set the encoding and collation for a table.
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
I hope this helps someone.
To set a FOREIGN KEY in Table B you must set a KEY in the table A.
In table A:
INDEX id (id)
And then in the table B,
CONSTRAINT `FK_id` FOREIGN KEY (`id`) REFERENCES `table-A` (`id`)
I had same problem and the solution was very simple.
Solution : foreign keys declared in table should not set to be not null.
reference : If you specify a SET NULL action, make sure that you have not declared the columns in the child table as NOT NULL. (ref
)
Check following rules :
First checks whether names are given right for table names
Second right data type give to foreign key ?
Please ensure that both the tables are in InnoDB format. Even if one is in MyISAM format, then, foreign key constraint wont work.
Also, another thing is that, both the fields should be of the same type. If one is INT, then the other should also be INT. If one is VARCHAR, the other should also be VARCHAR, etc.
I faced the issue and was able to resolve it by making sure that the data types were exactly matching .
I was using SequelPro for adding the constraint and it was making the primary key as unsigned by default .
Check the signing on both your table columns. If the referring table column is SIGNED, the referenced table column should be SIGNED too.
My problem was that I was trying to create the relation table before other tables!
So you have two ways to fix it:
change the order of MSQL commands
run this before your queries:
SET foreign_key_checks = 0;
NOTE: The following tables were taken from some site when I was doing
some R&D on the database. So the naming convention is not proper.
For me, the problem was, my parent table had the different character set than that of the one which I was creating.
Parent Table (PRODUCTS)
products | CREATE TABLE `products` (
`productCode` varchar(15) NOT NULL,
`productName` varchar(70) NOT NULL,
`productLine` varchar(50) NOT NULL,
`productScale` varchar(10) NOT NULL,
`productVendor` varchar(50) NOT NULL,
`productDescription` text NOT NULL,
`quantityInStock` smallint(6) NOT NULL,
`buyPrice` decimal(10,2) NOT NULL,
`msrp` decimal(10,2) NOT NULL,
PRIMARY KEY (`productCode`),
KEY `productLine` (`productLine`),
CONSTRAINT `products_ibfk_1` FOREIGN KEY (`productLine`) REFERENCES `productlines` (`productLine`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
Child Table which had a problem (PRICE_LOGS)
price_logs | CREATE TABLE `price_logs` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`productCode` varchar(15) DEFAULT NULL,
`old_price` decimal(20,2) NOT NULL,
`new_price` decimal(20,2) NOT NULL,
`added_on` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `productCode` (`productCode`),
CONSTRAINT `price_logs_ibfk_1` FOREIGN KEY (`productCode`) REFERENCES `products` (`productCode`) ON DELETE CASCADE ON UPDATE CASCADE
);
MODIFIED TO
price_logs | CREATE TABLE `price_logs` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`productCode` varchar(15) DEFAULT NULL,
`old_price` decimal(20,2) NOT NULL,
`new_price` decimal(20,2) NOT NULL,
`added_on` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `productCode` (`productCode`),
CONSTRAINT `price_logs_ibfk_1` FOREIGN KEY (`productCode`) REFERENCES `products` (`productCode`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1
One additional cause of this error is when your tables or columns contain reserved keywords:
Sometimes one does forget these.
If you are getting this error with PhpMyAdmin, disable foreign key checks before importing the SQL file.
For me the target table was blocking the foreign key.
I had to set Auto-Increment (AI) on the table the Foreign-Key was pointing to.
I had a similar error in creating foreign key in a Many to Many table where the primary key consisted of 2 foreign keys and another normal column. I fixed the issue by correcting the referenced table name i.e. company, as shown in the corrected code below:
create table company_life_cycle__history -- (M-M)
(
company_life_cycle_id tinyint unsigned not null,
Foreign Key (company_life_cycle_id) references company_life_cycle(id) ON DELETE CASCADE ON UPDATE CASCADE,
company_id MEDIUMINT unsigned not null,
Foreign Key (company_id) references company(id) ON DELETE CASCADE ON UPDATE CASCADE,
activity_on date NOT NULL,
PRIMARY KEY pk_company_life_cycle_history (company_life_cycle_id, company_id,activity_on),
created_on datetime DEFAULT NULL,
updated_on datetime DEFAULT NULL,
created_by varchar(50) DEFAULT NULL,
updated_by varchar(50) DEFAULT NULL
);
I had similar error with two foreign keys for different tables but with same key names! I have renamed keys and the error had gone)
Had a similar error, but in my case I was missing to declare the pk as auto_increment.
Just in case it could be helpful to anyone
I got the same error. The cause in my case was:
I created a backup of a database via phpmyadmin by copying the whole database.
I created a new db with the same name the old db had und selected it.
I started an SQL script to create updated tables and data.
I got the error. Also when I disabled foreign_key_checks. Altough the database was completely empty.
The cause was: Since i used phpmyadmin to create some foreign keys in the renamed database - the foreign keys where created with a database name prefix but the database name prefix was not updated. So there were still references in the backup-db pointing to the newly created db.
My solution is maybe a little embarrassing and tells the tale of why you should sometimes look at what you have in front of you instead of these posts :)
I had ran a forward engineer before, which failed, so that meant that my database already had a few tables, then i have been sitting trying to fix foreign key contraints failures trying to make sure that everything was perfect, but it ran up against the tables previously created, so it was to no prevail.
In my case, there was a syntax error which was not explicitly notified by MySQL console upon running the query. However, SHOW ENGINE INNODB STATUS command's LATEST FOREIGN KEY ERROR section reported,
Syntax error close to:
REFERENCES`role`(`id`) ON DELETE CASCADE) ENGINE = InnoDB DEFAULT CHARSET = utf8
I had to leave a whitespace between REFERENCES and role to make it work.
For me it was - you can't omit prefixing the current DB table if you create a FK for a non-current DB referencing the current DB:
USE currrent_db;
ALTER TABLE other_db.tasks ADD CONSTRAINT tasks_fk FOREIGN KEY (user_id) REFERENCES currrent_db.users (id);
If I omit "currrent_db." for users table, I get the FK error. Interesting that SHOW ENGINE INNODB STATUS; shows nothing in this case.
My Solution!!
If we want to have column1 of table1 as a foreign key of table2, then column1 should be a key of table1.
For example, consider we have departments table, which has dept_id column.
Now let's say we have another table named employees which has emp_dept_id column.
If we want to use the dept_id column of the department table as a foreign key for the emp_dept_id column of emp, then the dept_id of department table SHOULD ATLEAST BE a key if not a primary key.
So make sure that dept_id of depratment is either a primary key or a unique key before using it as a foreign key for another table.
I had this same issue then i corrected the Engine name as Innodb in both parent and child tables and corrected the reference field name
FOREIGN KEY (c_id) REFERENCES x9o_parent_table(c_id)
then it works fine and the tables are installed correctly. This will be use full for someone.

Tables are empty set in MySQL

I used MySQL Workbench to generate a database and now I inserted it into the command-line client using:
mysql> . C:\Documents and
Settings\kdegroote\My
Documents\School\2008-2009\ICT2
\Gegevensbanken\Labo\Hoofdstuk 3 oef
6\pizzasecondtry.sql
For some reason, the last table won't be accepted. "Cannot create table" is the error message.
I manually editted the data to basically be the same, just without the special options Workbench adds to it and it worked like that.
I've been studying the original but I don't understand why it won't show me the tables.
So I was wondering if anybody here could have a look at it. Maybe someone else will see what I'm overlooking.
SET #OLD_UNIQUE_CHECKS=##UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET #OLD_FOREIGN_KEY_CHECKS=##FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET #OLD_SQL_MODE=##SQL_MODE, SQL_MODE='TRADITIONAL';
CREATE SCHEMA IF NOT EXISTS `PizzaDelivery` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
USE `PizzaDelivery`;
CREATE TABLE IF NOT EXISTS `PizzaDelivery`.`Visitors` (
`visitor_id` INT NOT NULL AUTO_INCREMENT ,
`name` VARCHAR(45) NOT NULL ,
`adres` VARCHAR(45) NOT NULL ,
`telephone` MEDIUMBLOB NOT NULL ,
`email` VARCHAR(45) NOT NULL ,
PRIMARY KEY (`visitor_id`))ENGINE=InnoDB;
CREATE TABLE IF NOT EXISTS `PizzaDelivery`.`Employees` (
`employee_id` INT NOT NULL AUTO_INCREMENT ,
`name` VARCHAR(45) NOT NULL ,
PRIMARY KEY (`employee_id`))ENGINE=InnoDB;
CREATE TABLE IF NOT EXISTS `PizzaDelivery`.`Orders` (
`order_id` INT NOT NULL AUTO_INCREMENT ,
`pizza` VARCHAR(45) NOT NULL ,
`extra` VARCHAR(45) NULL ,
`kind` VARCHAR(45) NOT NULL ,
`amount` VARCHAR(45) NOT NULL ,
`visitor_id` INT NOT NULL ,
`employee_id` INT NOT NULL ,
`order_time` TIME NOT NULL ,
PRIMARY KEY (`order_id`) ,
INDEX `visitor_id` (`visitor_id` ASC) ,
INDEX `employee_id` (`employee_id` ASC) ,
CONSTRAINT `visitor_id`
FOREIGN KEY (`visitor_id` )
REFERENCES `PizzaDelivery`.`Visitors` (`visitor_id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `employee_id`
FOREIGN KEY (`employee_id` )
REFERENCES `PizzaDelivery`.`Employees` (`employee_id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)ENGINE=InnoDB;
CREATE TABLE IF NOT EXISTS `PizzaDelivery`.`Deliveries` (
`employee_id` INT NOT NULL ,
`order_id` INT NOT NULL ,
`voertuig_id` INT NOT NULL ,
`deliverytime` TIME NOT NULL ,
PRIMARY KEY (`employee_id`, `order_id`) ,
INDEX `employee_id` (`employee_id` ASC) ,
INDEX `order_id` (`order_id` ASC) ,
CONSTRAINT `employee_id`
FOREIGN KEY (`employee_id` )
REFERENCES `PizzaDelivery`.`Employees` (`employee_id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `order_id`
FOREIGN KEY (`order_id` )
REFERENCES `PizzaDelivery`.`Orders` (`order_id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)ENGINE=InnoDB;
SET SQL_MODE=#OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=#OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=#OLD_UNIQUE_CHECKS;
You can often get more information from an InnoDB error like this:
mysql> SHOW ENGINE INNODB STATUS;
The output is long, but among the status output I saw this:
------------------------
LATEST FOREIGN KEY ERROR
------------------------
081221 12:02:36 Error in foreign key constraint creation
for table `pizzadelivery/deliveries`.
A foreign key constraint of name `pizzadelivery/employee_id`
already exists.
The problem is that the Deliveries and the Orders tables both declare a foreign key constraint named employee_id.
Constraint names must be unique across all tables in a given database. The "errno: 121" is an InnoDB error code indicating a duplicate key error. In this case, the uniqueness of constraint names is not satisfied.
You can fix this problem and still keep your foreign key constraints if you just change the name of the declared constraint, for example:
CREATE TABLE IF NOT EXISTS `PizzaDelivery`.`Deliveries` (
. . .
CONSTRAINT `employee_id2`
FOREIGN KEY (`employee_id` )
. . .
PROBLEM SOLVED.
I solved my problem here rather by accident.
The problem appeared to be the constraints in the "Deliveries" table.
The 2 primairy keys are foreign keys at the same time and that generates and error if you want to constrain them.
So I simply left out the constraints and everything works.
Try use PizzaDelivery before running show tables. You created your tables in the PizzaDelivery schema, but you probably connected with a different default schema. The default schema is the parameter to the mysql command line client:
$ mysql -h <db-host> -u <username> -p <schema-name>
(note: -p means prompt for password when it is not given an argument, which you generally shouldn't do because arguments show up in ps output and also get saved to disk in shell history. All of the command line parameters are optional.)