web-dev-qa-db-fra.com

SQLite si la colonne existe

Je me demandais s'il existait une option Nice IF NOT EXISTS pour la vérification des colonnes et des index dans SQLite, ou dois-je récupérer le schéma de base de données complet et le valider?

20
Nathan

Oui, la syntaxe suivante est prise en charge dans sqlite: CREATE INDEX IF NOT EXISTS ...

Vois ici

Pour vérifier l'existence d'une colonne, vous pouvez simplement essayer de faire quelque chose comme SELECT col from TABLE. S'il ne renvoie pas d'erreur, votre table contient col.

8
Brian R. Bondy

Il existe une table de catalogue système appelée sqlite_master que vous pouvez utiliser pour vérifier les noms d'index (ou autres):

SELECT name FROM sqlite_master WHERE type='index' ORDER BY name;

Vous pouvez utiliser un pragma pour obtenir les colonnes indexées:

PRAGMA index_info(index-name);

Et celui-ci pour obtenir les noms de colonne d'une table:

PRAGMA table_info(table-name);
36
Tim

Dans SQLite, si vous voulez vérifier si votre colonne/champ existe ou non dans votre table .... essayez cette réponse fonctionne pour moi ... https://stackoverflow.com/a/28146506/3126569

Cursor res = db.rawQuery("PRAGMA table_info("+tableName+")",null);
int value = res.getColumnIndex(fieldName);
3
Pankaj Jangid

C'est comme ça que je le fais, 

INSERT  INTO AUDITEVENT (CODE, DESCRIPTION, AUDITEVENTPK)  
SELECT 'value1', 'value2', 'value3' 
WHERE NOT EXISTS (SELECT 1 FROM AUDITEVENT WHERE CODE = 'value1')

Dans mon IDConneciton, j'ai une méthode appelée ProcessCommandText pour mettre à jour la requête à partir de la syntaxe SQL Server vers SQLite uniquement. 

Ceci est la mise en œuvre de cette méthode 

public string ProcessSqlText(string text)
{
    var result = text.Replace("SET ANSI_NULLS ON", "").
            Replace("SET ANSI_NULLS ON", "").
            Replace(" ASC)", ")").
            Replace("TOP 100", "TOP(100)").
            Replace("TOP 1", "TOP(1)").
            Replace(" VARCHAR", " NVARCHAR").
            Replace(" CHAR", " NCHAR").
            Replace(" TEXT", " NTEXT").
            Replace("WITH ( IGNORE_DUP_KEY = OFF)", "").
            Replace("SET QUOTED_IDENTIFIER ON", "").
            Replace("SET ANSI_PADDING ON", "").
            Replace("SET ANSI_PADDING OFF", "").
            Replace("SET ANSI_WARNINGS ON", "").Trim(' ').
            Replace("WITH NOCHECK", "").
            Replace("(nolock)", "").
            Replace("CREATE CLUSTERED INDEX", "CREATE NONCLUSTERED INDEX").
            Replace("CREATE UNIQUE CLUSTERED INDEX", "CREATE UNIQUE NONCLUSTERED INDEX").
            Replace("[dbo].", "").
            ToUpper().
            Replace("NEWID()", "'" + Guid.NewGuid().ToString() + "'"). // NEWID() is not supported
            Replace("GO", ""); // GO is not supported


    if (result.Contains("TOP(100)"))
    {
        result = result.Replace("TOP(100)", "");
        result += " LIMIT 100";
    }
    if (result.Contains("TOP(1)"))
    {
        result = result.Replace("TOP(1)", "");
        result += " LIMIT 1";
    }
    if (result.Contains("DATEPART"))
    {
        result = result.Replace("DATEPART", "strftime");
        result = result.Replace("minute", "'%M'");
        result = result.Replace("day", "'%d'");
        result = result.Replace("month", "'%m'");
        result = result.Replace("year", "'%Y'");
    }

    result = TransformIfNotExistsQueriesToSqlLite(result);
    return result;
}

private string TransformIfNotExistsQueriesToSqlLite(string query)
{
    var ifNotExistsRegEx = @"(IF NOT EXISTS\s+)\(+.+\)+\r+\n+INSERT+";
    var m = Regex.Match(query, @"(IF NOT EXISTS\s+)\(+.+\)+\r+\n+INSERT+", RegexOptions.IgnoreCase);

    if (m.Groups.Count > 0 && m.Groups[0].Value.Contains("IF NOT EXISTS"))
    {
        var conditionalStatement = m.Groups[0].Value;
        var newQuery = query.Replace(conditionalStatement, " INSERT ");
        conditionalStatement = conditionalStatement.ToUpper().Replace("IF", "WHERE").Replace("INSERT", "");

        newQuery = Regex.Replace(newQuery.ToUpper(), @"VALUES\s+\(+", " SELECT ");
        var lastIndexOfClosingBracket = newQuery.LastIndexOf(')');
        newQuery = newQuery.Substring(0, lastIndexOfClosingBracket);
        return newQuery + " " + conditionalStatement;   
    }
    return query;
}
0
Has AlTaiar