Creating a foreign key in MySQL produces error: - sql

I'm trying to create a foreign key on a table in MySQL and I'm getting a strange error that there seems to be little info about in any of my searches.
I'm creating the key with this (emitted from mysql workbench 5.2):
ALTER TABLE `db`.`appointment`
ADD CONSTRAINT `FK_appointment_CancellationID`
FOREIGN KEY (`CancellationID` ) REFERENCES `db`.`appointment_cancellation` (`ID` )
ON DELETE NO ACTION
ON UPDATE NO ACTION
, ADD INDEX `FK_appointment_CancellationID` (`CancellationID` ASC) ;
at which point I get the error:
ERROR 1452: Cannot add or update a child row: a foreign key constraint fails (alarmtekcore., CONSTRAINT FK_lead_appointment_CancellationID FOREIGN KEY (CancellationID) REFERENCES lead_appointment_cancellation (`)
I've checked here
but there's no data in the table.

You can't apply a foreign key constraint on a column with pre-existing data that doesn't already exist in the parent table.
If you run the following to populate the appointment_cancellation table, you should be able to apply the foreign key afterwards:
INSERT INTO appointment_cancellation
SELECT DISTINCT a.CancellationID
FROM appointment

The two fields - appointment.CancellationID and appointment_cancellation.ID - need to be exactly the same type. If one is INT and the other is INT UNSIGNED, you'll get this error.

Related

Weird mysql behavior when adding foreign key

I am trying to add a simple foreign key like so
ALTER TABLE `4over4local`.`wf_job_status`
ADD CONSTRAINT `fk_sales_job_status_sales_job1`
FOREIGN KEY (`job_id`)
REFERENCES `4over4local`.`sales_job` (`job_id`)
ON DELETE CASCADE
ON UPDATE CASCADE;
But i am getting a very weird error with some database table named #sql-d74_9 that doesn't even exist.
ERROR 1452: Cannot add or update a child row: a foreign key constraint fails (`4over4local`.`#sql-d74_9`,
CONSTRAINT `fk_sales_job_status_sales_job1` FOREIGN KEY (`job_id`) REFERENCES `sales_job` (`job_id`)
ON DELETE CASCADE ON UPDATE CASCADE)
I have previously made very similar queries and they all worked fine except this one. What could cause this and what i am doing wrong? I am using MariaDB 13
The error indicates that you have rows in the table that do not satisfy the foreign key constraint you are trying to add. You need to fix your data before you can create the constraint.
You can exhibit offending rows with the following query:
select wjs.*
from wf_job_status wjs
where not exists (select 1 from sales_job sj where sj.job_id = wjs.job_id)

How do i add foreign key to existing table?

I am trying to add a foreign key to the table STUDENTS from the table PROGRAMS
ALTER TABLE COLLEGE.dbo.STUDENTS
ADD FOREIGN KEY(ProgramId) REFERENCES
PROGRAMS(ProgramId);
But it giving the following error :
Foreign key 'ProgramId' references invalid column 'ProgramId' in referencing table 'STUDENTS'
Not sure what i am doing wrong here any tip or solution would be a great help.
The column needs to exist in the table before it can be used for a foreign key reference. So I assume you intend something like:
ALTER TABLE COLLEGE.dbo.STUDENTS
ADD ProgramId INT; -- have to guess at the type
ALTER TABLE COLLEGE.dbo.STUDENTS
ADD FOREIGN KEY (ProgramId) REFERENCES
PROGRAMS(ProgramId);
You appear to want to add a column with a related foreign key.
In SQL Server, you can do this in a single commad, like so:
ALTER TABLE COLLEGE.dbo.STUDENTS
ADD ProgramId INTEGER
CONSTRAINT StudentsProgramIdFk FOREIGN KEY(ProgramId) REFERENCES PROGRAMS(ProgramId);
You should adjust the datatype of the column to your exact need. The key point is that the new column must have the same datatype as the column it references (that is PROGRAMS(ProgramId)).

MSSQL Foreign Key Relationship and Null values

I'm having problems adding a foreign key to an existing table where the foreign key can be null.
Say I have a user table and a data table. The data table already has a working foreign key on the "createdBy" colum to the user table ID column. I've just added a second column to the data table "EditedBy" that allows for null values (meaning the data record hasn't been edited). So all the existing records have NULL as the value for this column.
I am trying to make a foreign key between Data.EditedBy and User.Id, but when I try to apply it, I get the following error.
The ALTER TABLE statement conflicted with the FOREIGN KEY constraint "FK_Data_User_EditedBy". The conflict occurred in database "Test", table "dbo.User", column 'Id'.
It seems like its having a problem with the NULL values in the data table, but NULL is an acceptable value for a foreign key.
What am I missing?
UPDATE:
Full statement is as follows
USE [Test]
GO
ALTER TABLE [dbo].[Data] WITH CHECK ADD CONSTRAINT [FK_Data_User_EditedBy] FOREIGN KEY([Id])
REFERENCES [dbo].[User] ([Id])
GO
Ok, I feel like an idiot. I was using Management studio to create the relationship, and after I posted the equivalent alter statement (which didn't work either), I realized I was trying to make a foreign key between the ID field of [data] and the ID field of [user].
Obviously that wont work.
I fixed the statement to use the correct field in the [data] table and all is well.

Why can't I add this foreign key?

I'll post only the main part. I have two tables, each one has to have the PK of the other as a FK.
CREATE TABLE apartment
(
cod_apartment INT NOT NULL PRIMARY KEY,
cod_offer INT NOT NULL
);
CREATE TABLE offer
(
cod_offer INT NOT NULL PRIMARY KEY,
cod_apartment INT NOT NULL
);
First I inserted the values on both tables and it was working, I could even search using "select * from...". But then I tried to add the foreign key:
This worked.
ALTER TABLE offer
ADD FOREIGN KEY (cod_apartment ) REFERENCES apartment;
And this not.
ALTER TABLE apartment
ADD FOREIGN KEY (cod_offer) REFERENCES offer;
This is the error message:
The ALTER TABLE statement conflicted with the FOREIGN KEY constraint "FK__apartment__cod_offer__6383C8BA". The conflict occurred in database "kleber_apartment", table "dbo.offer", column 'cod_offer'.
The problem is, every time I try to execute, the FK name changes. And this FK actually doesn't exist. I already dropped both tables and tried to insert the values again, but the same happens.
What could be?
That means you're trying to add a foreign key when existing data doesn't obey that constraint. So you have a record in your apartment table where the cod_offer column does not match any value in the cod_apartment table.
Adding a foreign key not only constrains future data, but it requires that any existing data must also follow the rule.
And regarding the 6383C8BA, whenever you add a constraint without giving it a name, SQL Server picks one for you. Personally, I'd recommend something like:
alter table dbo.apartment
add constraint FK_apartment__cod_offer
foreign key (cod_offer) references dbo.offer (cod_offer);
This lets you define names the way you want, and is a little more clear about what you're actually building.

Adding Constraint with multiple foreign keys

I have a SQL database opened with visual studio, and I need to add some constraints to a table already created. I need a foreign key, which already has a foreign key from a third table. To explain better ,
Table ANIMALI needs a foreign key from table GABBIA, which has already a foreign key from table STANZA. This was the code I came up with:
ALTER TABLE ANIMALE ADD CONSTRAINT REF_ANIMA_GABBI_FK FOREIGN KEY (n_stanza, n_gabbia) REFERENCES GABBIA(n_stanza, n_gabbia);
This gives me an error, n_stanza is a column id not valid. I think it's about the fact that the ID for the class GABBIA is taken from joining n_gabbia and n_stanza, the latter being a key in class STANZA.
Can anyone help me out?
In order for your ALTER TABLE statement to work as written, both tables (not classes) "ANIMALE" and "GABBIA" must include the columns "n_stanza" and "n_gabbia".
In addition, in the table "GABBIA", there must be either a primary key constraint or a unique constraint on the pair of columns "n_stanza" and "n_gabbia". That is, you need something like either primary key (n_stanza, n_gabbia) or unique (n_stanza, n_gabbia) in the table "GABBIA".