SQLite

SQLite

falt ๐Ÿ’Œ o 2024. 11. 12. 00:59

์—ฌ๋Ÿฌ ๊ฐœ์˜ PRIMARY KEY ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•

ํ•œ ๊ฐœ์˜ PRIMARY KEY๋งŒ ์ง€์ •ํ•  ๋•Œ์—๋Š” column_name data_type PRIMARY KEY ์™€ ๊ฐ™์ด ์ง€์ •ํ•˜๋ฉด ๋˜์ง€๋งŒ, ์—ฌ๋Ÿฌ ๊ฐœ์˜ PRIMARY KEY๋ฅผ ์ง€์ •ํ•  ๋•Œ์—๋Š” column๋“ค์„ ๋จผ์ € ์จ์ค€ ๋‹ค์Œ PRIMARY KEY(col1, col2)๋ฅผ ์จ ์ค˜์•ผ ํ•œ๋‹ค.

sqlite> CREATE TABLE asdf (a int, b int, PRIMARY KEY(a,b) );

sqlite> INSERT INTO asdf VALUES(1,1);  
sqlite> INSERT INTO asdf VALUES(1,1);  
Runtime error: UNIQUE constraint failed: asdf.a, asdf.b (19)  
sqlite> INSERT INTO asdf VALUES(1,2);  
sqlite> INSERT INTO asdf VALUES(1,2);  
Runtime error: UNIQUE constraint failed: asdf.a, asdf.b (19)  
sqlite> INSERT INTO asdf VALUES(2,2);  
sqlite> INSERT INTO asdf VALUES(2,1);  
sqlite> SELECT * FROM asdf;  
1|1  
1|2  
2|2  
2|1

์—ฌ๋Ÿฌ ๊ฐœ์˜ PK๊ฐ€ ์žˆ์„ ๋•Œ์—๋Š” ๋ชจ๋“  PK์˜ ๊ฐ’์ด ๋ชจ๋‘ ๊ฐ๊ฐ ์ผ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ๋งŒ ์ถฉ๋Œ๋กœ ๊ฐ„์ฃผํ•œ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  UNIQUE๋Š” ํ•œ ๊ฐœ์ด๋“  ์—ฌ๋Ÿฌ ๊ฐœ์ด๋“  ์ƒ๊ด€ ์—†์ด ๊ทธ ํ•ด๋‹น ์นผ๋Ÿผ์—์„œ ๊ฐ™์€ ๊ฐ’์ด ์žˆ์œผ๋ฉด ๋ฌด์กฐ๊ฑด ์ถฉ๋Œ์„ ์ผ์œผํ‚จ๋‹ค.

sqlite> CREATE TABLE asdf(a int UNIQUE,b int UNIQUE);
sqlite> INSERT INTO asdf VALUES(1,1);
sqlite> INSERT INTO asdf VALUES(1,2);
Runtime error: UNIQUE constraint failed: asdf.a (19)
sqlite> INSERT INTO asdf VALUES(2,1);
Runtime error: UNIQUE constraint failed: asdf.b (19)
sqlite> INSERT INTO asdf VALUES(2,2);
sqlite> SELECT * FROM asdf;
1|1
2|2

 

 

 

 

PK ์ถฉ๋Œ ์‹œ INSERTํ•˜์ง€ ์•Š๋Š” ๋ฐฉ๋ฒ•

INSERT OR IGNORE INTO๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด PK๊ฐ€ ์ถฉ๋Œํ•˜๋Š” ํ–‰์€ ๋ฌด์‹œํ•˜๊ณ  ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

sqlite> CREATE TABLE IF NOT EXISTS User(Id INTEGER PRIMARY KEY,Name TEXT);
sqlite> INSERT INTO User VALUES(1,'Jeff'),(3,'John');
sqlite> INSERT INTO User VALUES(1,'Jiff'),(2,'Smith'),(3,'Julia'),(4,'Kotlin');
Runtime error: UNIQUE constraint failed: User.Id (19)
sqlite> INSERT OR IGNORE INTO User VALUES(1,'Jiff'),(2,'Smith'),(3,'Julia'),(4,'Kotlin');
sqlite> SELECT * FROM User;
1|Jeff
2|Smith
3|John
4|Kotlin

 

 

 

 

PK ์ค‘๋ณต ์‹œ ๋ฎ์–ด์“ฐ๋Š” ๋ฐฉ๋ฒ•

๋‹ค์Œ๊ณผ ๊ฐ™์ด ON CONFLICT DO UPDATE SET์„ ์‚ฌ์šฉํ•˜์—ฌ PK ์ค‘๋ณต ์‹œ ์ž์‹ ์ด ์›ํ•˜๋Š” column์˜ ๊ฐ’์„ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

sqlite> INSERT INTO User(Id,Name) VALUES(1,'Jiff'),(2,'Smiss'),(4,'Python'),(5,'C#') ON CONFLICT DO UPDATE SET Name=excluded.Name;
sqlite> SELECT * FROM User;
1|Jiff
2|Smiss
3|John
4|Python
5|C#

 

 

 

 

์—ฌ๊ธฐ์„œ๋ถ€ํ„ฐ๋Š” C#์—์„œ SQLite๋ฅผ ์“ฐ๋Š” ๊ฒƒ์— ๊ด€ํ•œ ๋‚ด์šฉ์ด๋‹ค.


e_sqlite3 ์˜ค๋ฅ˜ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

System.DllNotFoundException: Unable to load DLL 'e_sqlite3' or one of its dependencies: ์ง€์ •๋œ ๋ชจ๋“ˆ์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. (0x8007007E)
   at System.Data.SQLite.UnsafeNativeMethods.sqlite3_config_none(SQLiteConfigOpsEnum op)
   at System.Data.SQLite.UnsafeNativeMethods.sqlite3_config_none(SQLiteConfigOpsEnum op)
   at System.Data.SQLite.SQLite3.StaticIsInitialized()
   at System.Data.SQLite.SQLiteLog.PrivateInitialize(String className)
   at System.Data.SQLite.SQLiteLog.Initialize(String className)
   at System.Data.SQLite.SQLiteConnection..ctor(String connectionString, Boolean parseViaFramework)
   at System.Data.SQLite.SQLiteConnection..ctor(String connectionString)

 

NuGet Package Manager์—์„œ SourceGear.sqlite3์„ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜ System.Data.SQLite.Core๋ฅผ ์„ค์น˜ํ•˜๋ฉด ๋œ๋‹ค. System.Data.SQLite.Core์„ ๋” ์ถ”์ฒœํ•œ๋‹ค. SourceGear.sqlite3์„ ์„ค์น˜ํ•  ๊ฒฝ์šฐ build target์„ x64 ๋“ฑ์œผ๋กœ ๋ฐ”๊ฟ”์ค˜์•ผ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

 

 

 

C#์—์„œ connectionString์— data source ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•

Windows 10 ๊ธฐ์ค€์œผ๋กœ ์•„๋ž˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ ํ•˜๋ฉด ๋œ๋‹ค. ํŒŒ์ผ์ด ์กด์žฌํ•˜์ง€ ์•Š์•„๋„ ๋˜์ง€๋งŒ, ํŒŒ์ผ์„ ๋‹ด์„ directory๋Š” ๋ฏธ๋ฆฌ ์ƒ์„ฑ๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๊ฒฝ๋กœ์— ์„ธ๋ฏธ์ฝœ๋ก (";")์ด ํฌํ•จ๋˜์–ด์žˆ์„ ๊ฒฝ์šฐ ๋ฐ˜๋“œ์‹œ ํฐ ๋”ฐ์˜ดํ‘œ๋กœ ๊ฐ์‹ธ์„œ ์ „๋‹ฌํ•ด์ค˜์•ผ ํ•œ๋‹ค.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SQLite;
namespace ConsoleApp100
{
    internal static class Program
    {
        public static void Main(string[] args)
        {
            try
            {
                string l = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
                l = Path.Combine(l, "not ex;st foใ…ฃd=r");
                Directory.CreateDirectory(l);
                l = Path.Combine(l, "tmp.db");
                using (SQLiteConnection conn = new SQLiteConnection("Data Source=\"" + l + "\""))
                {
                    conn.Open();
                    using (SQLiteCommand cmd = conn.CreateCommand())
                    {
                        cmd.CommandText = "CREATE TABLE IF NOT EXISTS tmptable(tmpid TEXT PRIMARY KEY, tmpname TEXT)";
                        cmd.ExecuteNonQuery();
                    }
                }
                Console.WriteLine(l);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }
        }
    }
}