sql >> データベース >  >> RDS >> Mysql

FIFOを介して完全にMySQLクライアントに接続します

    FIFOの問題は、データを入力しているすべてのプロセスが終了すると、読み取り中のプロセス(この場合はmysql)に信号を送ることです。 )データの終わりなので、終了します。

    秘訣は、FIFO入力を常に有効に保つプロセスがあることを確認することです。これを行うには、sleep 999999999 > fifofileを実行します。 バックグラウンドで。

    例:

    #!/bin/sh
    
    mkfifo /tmp/sqlpipe
    
    sleep 2147483647 > /tmp/sqlpipe &
    PID=$!
    
    mysql -B -uUSER -pPASSWORD < /tmp/sqlpipe &
    
    # all set up, now just push the SQL queries to the pipe, exemple:
    echo "INSERT INTO table VALUES (...);" > /tmp/sqlpipe
    echo "INSERT INTO table VALUES (...);" > /tmp/sqlpipe
    echo "INSERT INTO table VALUES (...);" > /tmp/sqlpipe
    cat "mysqldump.sql" > /tmp/sqlpipe
    echo "DELETE FROM table WHERE ...;" > /tmp/sqlpipe
    
    # done! terminate pipe
    kill -s SIGINT $PID
    rm /tmp/sqlpipe
    

    最後に、sleepを終了します FIFO入力を完全に解放するプロセス。 mysqlに信号を送ります 入力が終了し、結果として自動的に停止すること。

    FIFOを必要としない代替手段もありますが、2つのスクリプトが必要になります。

    run.sh:

    #!/bin/sh
    ./querygenerator.sh | mysql -B -uUSER -pPASSWORD
    

    querygenerator.sh:

    #!/bin/sh
    echo "INSERT INTO table VALUES (...);"
    echo "INSERT INTO table VALUES (...);"
    echo "INSERT INTO table VALUES (...);"
    cat "mysqldump.sql"
    echo "DELETE FROM table WHERE ...;"
    


    1. データベースの列文字列がsqliteのクエリのサブ文字列であるかどうかを確認します

    2. UNIQUEKEYに違反したときに行のIDを取得する

    3. WHERE句に条件があるLEFTJOINが、ONにある同じLEFT JOINと同等ではないのはなぜですか?

    4. CREATE FUNCTIONエラーこの関数には、DETERMINISTIC、NO SQL、またはREADSSQLDATAがありません。