Cannot update table (Violation of PRIMARY KEY constraint)

Hello i have two tables tblPollutants and Pollutant
When i am trying to run the query that exists in the code Snippet: i am getting this error:
Violation of PRIMARY KEY constraint 'PK_tblPollutants'. Cannot insert duplicate key in object 'dbo.tblPollutants'.
the query  finds similar values between the two tables and updates the id from the Pollutant table


i have attached an sql script in order to create the two tables


This is the query where i am facing the problem
 
Update    tblPollutants
set tblPollutants.PollutantID = Pollutant.PollutantId
FROM         tblPollutants INNER JOIN
                      Pollutant ON tblPollutants.Pollutant = Pollutant.PollutantName

Open in new window

Insert.txt
LVL 4
MiltonAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

Kevin CrossChief Technology OfficerCommented:
If those are autonumbered primary key fields, they won't necessarily match between tables and you can't change one to match the other when the other table has a record with that id already existing hence your error message.  The main point though is you shouldn't be.  If these ids were to match in the first place, the design of the tables/database should be reviewed for possible change and use trigger, cascading keys, or handle inserts in order where you use the SCOPE_IDENTITY() of first insert for subsequent ones.
0
Aneesh RetnakaranDatabase AdministratorCommented:
You are trying to update the primary key column with a value thats already there that's why it is throwing the error

try this on the backup database
Update    tblPollutants
set tblPollutants.PollutantID = Pollutant.PollutantId
FROM         tblPollutants INNER JOIN
Pollutant ON tblPollutants.Pollutant = Pollutant.PollutantName
WHERE tblPollutants.PollutantID <> Pollutant.PollutantId
0
Raja Jegan RSQL Server DBA & Architect, EE Solution GuideCommented:
Your Pollutant ID 287, 310 are repeated twice and hence you obtain the error.

Fix it out in the INSERT statements to get it corrected.
0
Determine the Perfect Price for Your IT Services

Do you wonder if your IT business is truly profitable or if you should raise your prices? Learn how to calculate your overhead burden with our free interactive tool and use it to determine the right price for your IT services. Download your free eBook now!

MiltonAuthor Commented:
aneeshattingal: ti gives me the same error  your query
Violation of PRIMARY KEY constraint 'PK_tblPollutants'. Cannot insert duplicate key in object 'dbo.tblPollutants'.
The statement has been terminated.


rrjegan17:  
when i am running this query i  see this values only once
select  pollutantid from pollutant
where pollutantid in (287,310)


mwvisa1: i am joining them on nvarchar column tblPollutants.Pollutant = Pollutant.PollutantName
0
Raja Jegan RSQL Server DBA & Architect, EE Solution GuideCommented:
If you see in the sample Inserts provided "Carbon tetrachloride" repeats twice in both the tables.
Kindly check that record and fix it.
0
Kevin CrossChief Technology OfficerCommented:
My point is that those tables primary keys don't have to match.  If they are joined by Pollutant, you can just ensure that the value of that field and PollutantName are set as unique in each of tables.  To have the numbers match, you would have to review design as stated as you probably don't want to insert these separately as currently doing as each table can assign different auto id based on transactions that occurred before.
0
MiltonAuthor Commented:
rrjegan17:  Thanks a lot how did you managed to find that? it seems to working right now let me check it on my main database and i will accept your answer

mwvisa1: Those tables primary keys have to match in my case because  i just want to copy the values from table a to table b for for a data warehouseproject

0
Kevin CrossChief Technology OfficerCommented:
Then you could have just done this:

SELECT *
INTO b
FROM a;

Or:
-- with no auto increment on id column in b
DELETE FROM b;

INSERT INTO b
SELECT * FROM a;
0
Raja Jegan RSQL Server DBA & Architect, EE Solution GuideCommented:
>> Thanks a lot how did you managed to find that? it seems to working right now let me check it on my main database and i will accept your answer

Just tried to find out the error record by running the insert scripts you provided in my machine.
And found what's wrong with the data since syntax is correct.
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
MiltonAuthor Commented:
Thank you all
0
MiltonAuthor Commented:
mwvisa1: yes i could use something like this but i wanted to use the cascade update option if i had delete the values from the tables and insert new values the cascade update  option will not work
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Microsoft SQL Server

From novice to tech pro — start learning today.