none
הכנסת ערך לטבלה RRS feed

  • שאלה

  • ברצוני לעשות insert ולהכניס ערך לטבלה מסויימת, אך קודם ברצוני לבדוק אם ערך זה  קיים כבר בטבלה (=אם מישהו דאג להכניס לפני ערך זה) ולהימנע מכפילויות.

    איך אוכל לדעת אם כבר קיים ערך מסויים בטבלה?

    תודה!

    שבת 07 יולי 2012 11:16

תשובות

  • למשל כך:

    Insert
    Into   MyTbl
    Select ....
    From   ....
    Except
    Select ....
    From   MyTbl;

    כמובן- יש להקפיד שה-Select הראשון וה-Select השני יהיו מתואמים:
    אותו מספר עמודות ואותו סדר עמודות.

    יתרון/חסרון: פעולת ה-Except מבצעת Distinct באותה הזדמנות חגיגית,
    אז מצד אחד הרווחת בדיקה למניעת כפילויות בקלט (כלומר- גם בדיקה שהשורה אינה קיימת בטבלת היעד וגם סינון כפילויות בקלט עצמו),
    אך מצד שני- אם משום מה דווקא רצית להכניס ערכים כפולים - זה לא יקרה..
    מצד שלישי- אם יש שתי שורות שונות אך בעלות אותו מפתח (בקלט או בקלט וביעד)- לא תימנע כך היווצרות שגיאה.


    Blog: http://about.me/GeriReshef


    • נערך על-ידי Geri_Reshef שבת 07 יולי 2012 12:10
    • סומן כתשובה על-ידי Shirly11 שבת 07 יולי 2012 14:41
    שבת 07 יולי 2012 12:04
  • דרך נוספת :

    insert Table_Name
    select 'value to insert'
    WHERE not exists (select * from Table_Name where FieldName = 'value to insert');
    והנה דוגמה מלאה:

    -- נעבור למסד הנתונים של המשחקים שלנו
    use QQ go
    -- DDL create table #QQ (txt nvarchar(10)) go insert #QQ select 'a' union select 'b' union select 'c' union select 'd' union select 'e' go
    -- ננסה להכניס נתון שכבר קיים ולכן הוא לא יכנס declare @Value as nvarchar(10) = 'a' insert #QQ select @Value WHERE not exists (select * from #QQ where txt = @Value); GO
    -- נכניס נתון חדש ולכן הוא יצליח ויכנס לטבלה declare @Value as nvarchar(10) = 'f' insert #QQ select @Value WHERE not exists (select * from #QQ where txt = @Value); GO select * from #QQ GO

    -- ניקוי
    drop table #QQ
    GO


    הערה: אם מדובר בפעולה קבועה ובטבלה שאף פעם לא אמורים להיות ערכים כפולים אז לפעמים יותר נכון פשוט להוסיף תנאי constrain או תנאי ייחודיות ואז לא צריך להוסיף כלום לשאילתות. בצורה זו פשוט שאילתות שלא מקיימות את התנאי או יוצרות כפילויות לא יעברו.


    signature

    • נערך על-ידי pituachMVP, Editor שבת 07 יולי 2012 12:47
    • סומן כתשובה על-ידי Shirly11 שבת 07 יולי 2012 15:23
    שבת 07 יולי 2012 12:30
    מנחה דיון

כל התגובות

  • למשל כך:

    Insert
    Into   MyTbl
    Select ....
    From   ....
    Except
    Select ....
    From   MyTbl;

    כמובן- יש להקפיד שה-Select הראשון וה-Select השני יהיו מתואמים:
    אותו מספר עמודות ואותו סדר עמודות.

    יתרון/חסרון: פעולת ה-Except מבצעת Distinct באותה הזדמנות חגיגית,
    אז מצד אחד הרווחת בדיקה למניעת כפילויות בקלט (כלומר- גם בדיקה שהשורה אינה קיימת בטבלת היעד וגם סינון כפילויות בקלט עצמו),
    אך מצד שני- אם משום מה דווקא רצית להכניס ערכים כפולים - זה לא יקרה..
    מצד שלישי- אם יש שתי שורות שונות אך בעלות אותו מפתח (בקלט או בקלט וביעד)- לא תימנע כך היווצרות שגיאה.


    Blog: http://about.me/GeriReshef


    • נערך על-ידי Geri_Reshef שבת 07 יולי 2012 12:10
    • סומן כתשובה על-ידי Shirly11 שבת 07 יולי 2012 14:41
    שבת 07 יולי 2012 12:04
  • דרך נוספת :

    insert Table_Name
    select 'value to insert'
    WHERE not exists (select * from Table_Name where FieldName = 'value to insert');
    והנה דוגמה מלאה:

    -- נעבור למסד הנתונים של המשחקים שלנו
    use QQ go
    -- DDL create table #QQ (txt nvarchar(10)) go insert #QQ select 'a' union select 'b' union select 'c' union select 'd' union select 'e' go
    -- ננסה להכניס נתון שכבר קיים ולכן הוא לא יכנס declare @Value as nvarchar(10) = 'a' insert #QQ select @Value WHERE not exists (select * from #QQ where txt = @Value); GO
    -- נכניס נתון חדש ולכן הוא יצליח ויכנס לטבלה declare @Value as nvarchar(10) = 'f' insert #QQ select @Value WHERE not exists (select * from #QQ where txt = @Value); GO select * from #QQ GO

    -- ניקוי
    drop table #QQ
    GO


    הערה: אם מדובר בפעולה קבועה ובטבלה שאף פעם לא אמורים להיות ערכים כפולים אז לפעמים יותר נכון פשוט להוסיף תנאי constrain או תנאי ייחודיות ואז לא צריך להוסיף כלום לשאילתות. בצורה זו פשוט שאילתות שלא מקיימות את התנאי או יוצרות כפילויות לא יעברו.


    signature

    • נערך על-ידי pituachMVP, Editor שבת 07 יולי 2012 12:47
    • סומן כתשובה על-ידי Shirly11 שבת 07 יולי 2012 15:23
    שבת 07 יולי 2012 12:30
    מנחה דיון
  • תגובתו של Pitoach כבודה במקומה מונח והיא מתאימה בעיקר כשרוצים למנוע הפרה של ה-Primary Key,
    ואז יש להשוות בפסוקית ה-Exists בין עמודות ה-PK;
    והמהדרין מוסיפין גם Group By על הקלט למניעת כפילויות במפתח בקלט עצמו (כשהמפתח אינו קיים עדיין בטבלת היעד)..

    Blog: http://about.me/GeriReshef

    שבת 07 יולי 2012 14:47